iOS开发技术点总结(二)

42.使用shareSDK分享到微博的时候,如果想使用微博客户端分享,则添加如下代码即可:

//允许使用微博客户端分享

[shareParams SSDKEnableUseClientShare];

SSUIShareActionSheetController *sheet = [ShareSDK showShareActionSheet:nil

items:nil shareParams:shareParams onShareStateChanged:^(SSDKResponseState state, SSDKPlatformType platformType, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error, BOOL end) {

switch (state) {

case SSDKResponseStateSuccess:

NSLog(@"分享成功!");

break;

case SSDKResponseStateFail:

NSLog(@"分享失败!");

break;

case SSDKResponseStateCancel:

NSLog(@"取消分享!");

break;

default:

break;

}

}];

//加了这个方法之后可以不跳分享编辑界面,直接点击分享菜单里的选项跳转到微博客户端

[sheet.directSharePlatforms addObject:@(SSDKPlatformTypeSinaWeibo)];

了解详情见该链接下的第三条

小技能ps:想要分享一个url到微博,而且还想附加上图片,如果你此时没有安装微博客户端,而且你把要分享的url写到了url参数中,并设置分享类型为网页,那么分享的时候会报错,导致分享不成功;解决办法是:把要分享的url写在text里面,微博会自动处理将你的url设为链接(分享类型改为SSDKContentTypeAuto)。

43.让imageView自适应图片自身的比例

imageView.contentMode = UIViewContentModeScaleAspectFit;

44.tableview滚动到指定位置

NSIndexPath * lastCell = [NSIndexPath indexPathForRow:0 inSection:5];

[tableViews scrollToRowAtIndexPath:lastCell atScrollPosition:UITableViewScrollPositionTop animated:YES];

45.获取线上版本号

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager POST:@"https://itunes.apple.com/lookup?id=1160657486" parameters:nil success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {

NSArray *array = responseObject[@"results"]; NSDictionary *dict = [array lastObject]; NSLog(@"当前版本为:%@", dict[@"version"]);

} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {

}];

46.iOS 8之后侧滑(左滑)方法进行了改进具体方法是:

- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{

// 添加一个删除按钮

UITableViewRowAction *deleteRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"删除" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {

// 先移除数据源数据

[self.dataArray removeObjectAtIndex:indexPath.row];

// 再动态刷新UITableView

[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];

NSLog(@"删除按钮");

}];

UITableViewRowAction *topRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"置顶" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {

NSLog(@"置顶按钮");

}];

/// 设置按钮颜色,Normal默认是灰色的,Default默认是红色的

topRowAction.backgroundColor = [UIColor orangeColor];

UITableViewRowAction *cancelRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"取消关注" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {

NSLog(@"取消关注按钮");

}];

return @[deleteRowAction,topRowAction,cancelRowAction];

}

使用该方法时注意:该方法只会在ios9之后的版本中才会有效,如果想在ios8以及ios8之前起作用的话必须额外加上下面这个代理方法:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

{

//方法内可以什么都不写,但必须加上,否则侧滑不起作用!!!

}


49.iPhone X的屏幕navigationBar高度和statusBar高度和它之前的区别

iPhone X之前的苹果:

navigationBar的frame为(0,20,screenWidth,44), statusbar的高度为20;

iPhone X:

navigationBar的frame为(0, 44, screenWidth, 44), statusbar的高度为44。

50.上拉加载更多回调调用多次的问题:

这种问题一般会出现在cell的高度是自适应高度的情况下,而且当前运行的手机系统为ios11!

总结其上拉的主要问题的原因是 tableViews :在iOS 11中默认启用Self-Sizing

这个应该是UITableView最大的改变。我们知道在iOS8引入Self-Sizing 之后,我们可以通过实现estimatedRowHeight相关的属性来展示动态的内容,实现了estimatedRowHeight属性后,得到的初始contenSize是个估算值,是通过estimatedRowHeight 乘以 cell的个数得到的,并不是最终的contenSize,只是当前屏幕能够显示的cell个数,滑动时,tableView不停地得到新的cell,更新自己的contenSize。

Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension:

如果目前项目中没有使用estimateRowHeight属性,在iOS11的环境下就要注意了,因为开启Self-Sizing之后,tableView是使用estimateRowHeight属性的,这样就会造成contentSize和contentOffset值的变化,如果是有动画是观察这两个属性的变化进行的,就会造成动画的异常,因为在估算行高机制下,contentSize的值是一点点地变化更新的,所有cell显示完后才是最终的contentSize值。因为不会缓存正确的行高,tableView reloadData的时候,会重新计算contentSize,就有可能会引起contentOffset的变化。

iOS11下不想使用Self-Sizing的话,可以通过以下方式关闭:

//添加以下代码就能解决你的问题

self.tableView.estimatedRowHeight =0;

self.tableView.estimatedSectionHeaderHeight =0;

self.tableView.estimatedSectionFooterHeight =0;

注意️:这种问题未使用上面解决办法而使用以下这种方法,只能解决留白问题,反而导致上拉刷新回弹问题

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{

return nil;

}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{

return nil;

}

总结:经测试最容易出现问题的是iOS11 plus机型,用出现问题的机型从App Store重新下载之前版本并不会出现问题,这些问题出现都是由于Xcode9运行iOS11所造成的。

参考文章:点我点我。

51.automaticallyAdjustsScrollViewInsets(默认为YES,iOS 11之后弃用了该方法,改为contentInsetAdjustmentBehavior)

Specifies whether or not the view controller should automatically adjust its scroll view insets.

@property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets

Discussion

Default value isYES, which allows the view controller to adjust its scroll view insets in response to the screen areas consumed by the status bar, navigation bar, and toolbar or tab bar. Set toNOif you want to manage scroll view inset adjustments yourself, such as when there is more than one scroll view in the view hierarchy.

Availability

Available in iOS 7.0 and later.

Declared In

UIViewController.h

大体意思为:当当前试图控制器的屏幕中存在导航条、状态栏、工具栏和tabbar的时候,自动布局它的scrollview,这种自动调整是在ScrollView是其视图添加的的第一个控件的时候,才会出现自动调整的效果,如果在添加ScrollView之前添加了其他控件,不论控件的frame,自动调整都会失效。

ios11之后为何弃用该方法?猜测:automaticallyAdjustsScrollViewInsets是当前试图控制器的点方法,相对于scrollview本身的contentInsetAdjustmentBehavior方法来说不够灵活,contentInsetAdjustmentBehavior可以对每个scrollview进行设置。

52.第三方登录之微信登录获取unionid

如果你用到了shareSDK或者友盟第三方登录,网上有人说需要再调用微信提供的方法

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

其实不需要,只需要在回调里拿到 NSLog(@"unionid:%@",user.credential.rawData[@"unionid"]);就可以。(shareSDK例子)

53.获取section指定行的frame

NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:section];

UICollectionViewLayoutAttributes* attr = [self.rightCollectionView.collectionViewLayout layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader atIndexPath:index];

NSLog(@"该行frame:%@",NSStringFromCGRect(attr.frame));

54.关于按钮和label

1、如果把按钮的userInteractionEnabled设为NO,那么按钮的点击事件无响应;默认为YES;

2、如果把按钮的userInteractionEnabled设为NO,即使未声明该按钮的方法,程序执行时,点击按钮也不会崩溃;

3、如果在一个label上添加点击手势,然后把label的userInteractionEnabled设为NO,那么不会触发手势;默认为NO;

55.关于runtime的交换方法实现

如果一个工程中有多个地方给label或者其他系统类添加catogry,并且交换了系统类的同一个方法实现,如果两个catogry交换后的方法名是一样的,例如控制器的catogryA交换了控制器的方法viewDidLoad改为sd_viewDidLoad,然而控制器的catogryB也交换了控制器的方法viewDidLoad改为sd_viewDidLoad,这时候系统就不会执行你自己写的交换的方法实现;但是如果改了其中一个方法的名字,比如A的或者B的方法改为了sd_viewDidLoad之外的其他方法名,那么这两个方法系统都会去执行(先后顺序未探索)。

你可能感兴趣的:(iOS开发技术点总结(二))