1.之前的全屏手势操作似乎变得无效了,其实查不到什么原因,我也不知道是怎么了,所以最后的调试方法就是找了个轮子,导入进去就可以全屏手势了(也可能被其他库给稀释了,毕竟是二次开发项目):
FDFullscreenPopGesture
注意的操作就是隐藏导航栏的时候
// 这是由于用了第三方库,导致一直被隐藏,也可能是因为此,导致bartintColor有问题(要导入上面那个库的包)
self.fd_prefersNavigationBarHidden = YES;
在某些位置禁止全屏手势(也要导包)
// 这个页面由于一些问题,禁止侧滑
self.fd_interactivePopDisabled = YES;
至于scrollView无法侧滑的bug,我根据查询的资料调试依旧没有效果,属于待解决的方案
2.手机宽高问题
我用的是苹果7按照比例来说应该是(375 * 667),但是手机运行的时候是320*568,但是我用苹果8p模拟器的时候又展示的是手机本身的尺寸,莫非我买了一个假的苹果手机?
在查询了网站上的问题之后,有说是因为没有lauchImage导致的,或者说lauchImage尺寸问题导致的,这个,我已经没有办法考证了,目前自闭中。。。
3.一直提到的Cell复用问题,这个属于老生长谈的问题了,Cell复用问题我用的解决办法都是“模型法则”,一个Cell针对一个模型这样子的处理方式,但是偶尔还是会出现复用的时候,比方说展示帖子列表的时候,出现了复用,针对这个情况,一定要冷静分析,到底是为什么出现了这个复用问题,用图层查看器查看一下,分析一下原因,相信应该会找出来答案的
-(void)setupImageView:(NSInteger)count{
// 原因は セイルの リウス クリエイト ノ バグ
for (UIImageView *imgView in self.pictureView.subviews) {
[imgView removeFromSuperview];
}
int maxColumns = 3;
CGFloat IWPhotoMargin = 10;
CGFloat leftRightMargin = 13;
CGFloat IWPhotoW = (kScreenW - leftRightMargin * 4)/3;
CGFloat IWPhotoH = 78 * IWPhotoW / 110;
// 初始化9个子控件
for (int i = 0; i<count; i++) {
UIImageView *photoView = [[UIImageView alloc] init];
photoView.userInteractionEnabled = YES;
photoView.tag = i + 100;
NSURL *url = [NSURL URLWithString:self.pictures[i]];
[photoView sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"shequdefault"]];
[photoView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(photoTap:)]];
// 设置子控件的frame
int col = i % maxColumns;
int row = i / maxColumns;
CGFloat photoX = col * (IWPhotoW + IWPhotoMargin);
CGFloat photoY = row * (IWPhotoH + IWPhotoMargin);
photoView.frame = CGRectMake(photoX, photoY, IWPhotoW, IWPhotoH);
[self.pictureView addSubview:photoView];
}
if (self.pictures.count == 0) {
self.pictureViewHConstraint.constant = 0;
}else if (self.pictures.count <= 3){
self.pictureViewHConstraint.constant = IWPhotoH;
}else{
self.pictureViewHConstraint.constant = IWPhotoH * 2 + 10;
}
}
- (void)photoTap:(UITapGestureRecognizer *)recognizer
{
//确定photo的张数
NSInteger count = self.pictures.count;
// 1.封装图片数据
NSMutableArray *myphotos = [NSMutableArray arrayWithCapacity:count];
for (int i = 0; i<count; i++)
{
// 一个MJPhoto对应一张显示的图片
MJPhoto *mjphoto = [[MJPhoto alloc] init];
// 告诉URL,来源于哪个UIImageView(目的:点击这个图片变大之后,再点击要还原到那个位置)
mjphoto.srcImageView = self.pictureView.subviews[i];
mjphoto.url = [NSURL URLWithString:self.pictures[i]]; // 图片路径
[myphotos addObject:mjphoto];
}
// 2.显示相册
MJPhotoBrowser *browser = [[MJPhotoBrowser alloc] init];
browser.currentPhotoIndex = recognizer.view.tag - 100; // 弹出相册时显示的第一张图片是?
browser.photos = myphotos; // 设置所有的图片
[browser show];
}
4.一种新的模型创建思维方式
以前的话,只会定义需要的数据里面关键的字段,这次的开发,让我学到了需要定义整个服务器模型的方案,这里用一个例子来说明
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class PANewHomeData,PAManagerList,PABannerPicList,PANoticeList;
@interface PANewHomeModel : NSObject
@property (assign,nonatomic)NSInteger status;
@property (copy,nonatomic)NSString *msg;
/** 数据 */
@property (strong,nonatomic) PANewHomeData *data;
@end
@interface PANewHomeData : NSObject
/** 轮播图数组 */
@property (strong,nonatomic) NSArray<PABannerPicList *> *bannerPicList;
/** 社区活动图 */
@property (copy,nonatomic) NSString *communityActivityPic;
/** 小区ID(用户获取公告集合用) */
@property (assign,nonatomic)NSInteger defaultVillageId;
/** 小区名称 */
@property (copy,nonatomic) NSString *defaultVillageName;
/** 消息数量 */
@property (assign,nonatomic)NSInteger informationNum;
/** 我的管家数组 */
@property (strong,nonatomic) NSArray<PAManagerList *> *myManagerList;
/** 通知公告集合 */
@property (strong,nonatomic) NSArray<PANoticeList *> *noticeList;
/** 当前用户公告未读数量(用户标记公告的红色数量) */
@property (assign,nonatomic)NSInteger noticeUnReadNum;
/** 到家服务图 */
@property (copy,nonatomic) NSString *servicePic;
/** 到家服务地址 */
@property (copy,nonatomic) NSString *serviceUrl;
@end
@interface PABannerPicList : NSObject
/** 图片url */
@property (copy,nonatomic) NSString *picUrl;
/** 图片类型(用于跳转到详情用) */
@property (copy,nonatomic) NSString *picType;
/** 图片ID(用于跳转到详情用) */
@property (copy,nonatomic) NSString *picId;
@end
@interface PAManagerList : NSObject
/** 名称 */
@property (copy,nonatomic) NSString *myManagerName;
/** 电话 */
@property (copy,nonatomic) NSString *myManagerPhone;
@end
@interface PANoticeList : NSObject
/** 通知公告ID(点击滚动信息进入详情) */
@property (assign,nonatomic) NSInteger noticeId;
/** 通知公告标题 */
@property (copy,nonatomic) NSString *noticeTitle;
@end
NS_ASSUME_NONNULL_END
首页.h
#import "PANewHomeModel.h"
@implementation PANewHomeModel
@end
@implementation PANewHomeData
+ (NSDictionary *)objectClassInArray{
return @{@"myManagerList" : [PAManagerList class],@"bannerPicList":[PABannerPicList class],@"noticeList":[PANoticeList class]};
}
@end
@implementation PANoticeList
@end
@implementation PABannerPicList
@end
@implementation PAManagerList
@end
首页.m
这里定义了每一个常量,字典单位不用进行转换,成为了下一个变量即可,如果是数组单位,需要在模型外包裹一个数组,也就是成为了泛型数组,这样子的方式,就让模型成为一级一级的台阶一样(这个objectClassInArray方法就取自MJExtension)
然后在请求里这么包裹,如此就完成了,先导包:
#import "NSObject+MJExtension.h"
然后:
-(id)getHomePageWithUserid:(NSInteger)userID CompletionHandle:(void (^)(id responseObj, NSError * error))completionHandle{
NSMutableDictionary *mutDic = [[NSMutableDictionary alloc] init];
mutDic[@"fUserId"] = @(userID);
NSString *path = @"这里填写请求的地址";
return [ZRYYCacheClient POST:path parameters:mutDic cachePolicy:LYHTTPClientReloadIgnoringLocalCacheData success:^(NSURLSessionDataTask *task, id responseObject) {
// 这里的parse方法,就是把responseObject转成PANewHomeModel这样子的模型方式,然后使用的时候,把responseObject前面的id变量,改成PANewHomeModel变量即可
completionHandle([PANewHomeModel parse:responseObject], nil);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
completionHandle(nil, error);
}];
}
这样子肯定swift使用者认为肯定不安全了,至于swift能否这样子使用我不知道,我的脑洞是:可以用,但是在下面要进行guard let..else进行一次校验
5.对缴费的认知
因为对缴费的理解,支付宝是有两个密钥的(公钥和私钥),我以为是前端自己配置,但是后端考虑到不安全因素,是后端配置密钥,然后给一个接口我们调用,所以我的处理就非常单纯了,就是发送一个请求生成订单(也没有在info里配置URL Types)
-(void)generateAliPayWuyeFeeWithBillMonths:(NSString *)billMonths Amount:(double)amount houseId:(NSInteger)houseID userId:(NSInteger)userId CompletionHandle:(void (^)(id, NSError *))completionHandle{
NSString *path = @"支付链接";
NSMutableDictionary *params = [[NSMutableDictionary alloc]init];
params[@"fUserId"] = @(userId);
params[@"houseId"] = @(houseID);
// 根据不同的订单类型,来决定支付哪个位置的订单
params[@"bizType"] = @"1";
params[@"billMonth"] = billMonths;
params[@"amount"] = @(amount);
[PAYYCacheClient POST:path parameters:params cachePolicy:LYHTTPClientReloadIgnoringLocalCacheData success:^(NSURLSessionDataTask *task, id responseObject) {
ZRLog(@"请求的数据%@",responseObject);
completionHandle([PAALiPayWYTCModel parse:responseObject],nil);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
completionHandle(nil,error);
}];
}
结果处理
// 发支付宝消息 fromScheme:这里是urltype里设置好的schme
[[AlipaySDK defaultService]payOrder:responseObj.data.ordeInfo fromScheme:@"paproperty" callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
在appdelegate的处理
#pragma mark -- 考虑这个app最低支持ios10,就设置这个即可
/*
* NOTE: 9.0以后使用新API接口
**/
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
/**
* resultStatus
* 状态码
* 9000 订单支付成功
* 8000 正在处理中
* 4000 订单支付失败
* 6001 用户中途取消
* 6002 网络连接出错
*/
// 注意条件判断,不然会造成支付卡顿时间很长等情况
if ([url.host isEqualToString:@"safepay"]) {
// 支付跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
ZRLog(@"result = %@",resultDic);
if ([resultDic[@"resultStatus"] integerValue] == 9000) {// 支付成功
// 在物业费里注册了一个通知,进行回调
[[NSNotificationCenter defaultCenter]postNotificationName:PayWYSuccessKey object:resultDic];
// 在停车费里注册了一个通知,进行回调
[[NSNotificationCenter defaultCenter]postNotificationName:PayTCSuccessKey object:resultDic];
}else{ // 支付失败了
[[NSNotificationCenter defaultCenter]postNotificationName:PayTCFailKey object:resultDic];
}
//发出通知
[[NSNotificationCenter defaultCenter] postNotificationName:kPayBack object:resultDic];
[[NSNotificationCenter defaultCenter]postNotificationName:PayWYFailKey object:resultDic];
}];
// 授权跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
ZRLog(@"result = %@",resultDic);
// 解析 auth code
NSString *result = resultDic[@"result"];
NSString *authCode = nil;
if (result.length>0) {
NSArray *resultArr = [result componentsSeparatedByString:@"&"];
for (NSString *subResult in resultArr) {
if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
break;
}
}
}
ZRLog(@"授权结果 authCode = %@", authCode?:@"");
}];
}
}
网友评论