1.升级Xcode 9 + iOS 11后,发现原本没问题,我的项目是支持ipad的,此时ios11系统的ipad会出现两侧空白。
首先如果你的app只支持ios 9及之上的,解决起来很简单,self.tableView.cellLayoutMarginsFollowReadableWidth = NO; 一句代码就行.
如果要支持更低版本,那就用自定义Cell好了.想显示文本用UILabel,想显示图片用UIImageView,分割线也可以用自己的,位置当然也由自己控制.有些人可能不想自己添加,就想用系统的textLabel,detailTextLabel和imageView.那就需要重写- (void)layoutSubviews方法.如下
- (void)layoutSubviews
{
[super layoutSubviews];
CGRect rect;
if (self.imageView.image) {
rect = self.imageView.frame;
rect.origin.x = 20;
self.imageView.frame = rect;
rect = self.textLabel.frame;
rect.origin.x = CGRectGetMaxX(self.imageView.frame) + 10;
self.textLabel.frame = rect;
rect = self.detailTextLabel.frame;
rect.origin.x = CGRectGetMaxX(self.imageView.frame) + 10;
self.detailTextLabel.frame = rect;
}else{
rect = self.textLabel.frame;
rect.origin.x = 20;
self.textLabel.frame = rect;
rect = self.detailTextLabel.frame;
rect.origin.x = 20;
self.detailTextLabel.frame = rect;
}
上面代码意思就是textLabel,detailTextLabel和imageView的大小以及垂直方向位置还是由系统决定,只有水平方向的x值由我们自己控制.然后就可以方便的使用cell了.
另外就是分割线的问题,自己定义就没什么好讲,如果用系统的,就要在控制器中设置一下.方法网上有,我就列一下.
在- (void)viewDidLoad中添加如下代码
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
然后在cellForRowAtIndexPath或者willDisplayCell代理方法中添加以下代码
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setSeparatorInset:)]){
[cell setSeparatorInset:UIEdgeInsetsMake(0, -1000, 0, -1000)];
}
注意的是[cell setSeparatorInset:UIEdgeInsetsMake(0, -1000, 0, -1000)];代码,一般都是用UIEdgeInsetsZero,但在这里不行,需要设置负值,并且要设置的大一点.然后就可以了.
2.升级Xcode 9 + iOS 11后,发现原本没问题的collectionView和tableView像是中了风一样,头部刷新UI出现了错乱。
查阅发现 iOS11弃用了automaticallyAdjustsScrollViewInsets属性,新增contentInsetAdjustmentBehavior来替代它
关于 contentInsetAdjustmentBehavior
@available(iOS 11.0, *)
public enum UIScrollViewContentInsetAdjustmentBehavior : Int {
case automatic // Similar to .scrollableAxes, but will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewContentInset = YES inside a navigation controller, regardless of whether the scroll view is scrollable
case scrollableAxes // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
case never // contentInset is not adjusted
case always // contentInset is always adjusted by the scroll view's safeAreaInsets
}
UIScrollViewContentInsetAdjustmentBehavior 是一个枚举类型,值有以下几种:
* -automatic 和scrollableAxes一样,scrollView会自动计算和适应顶部和底部的内边距并且在scrollView 不可滚动时,也会设置内边距.
* -scrollableAxes 自动计算内边距.
* -never不计算内边距
* -always 根据safeAreaInsets 计算内边距
很显然,我们这里要设置为 never
开始适配
OC 中
//声明tableView的位置 添加下面代码
if (@available(iOS 11.0, *)) {
_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
_tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0);
_tableView.scrollIndicatorInsets = _tableView.contentInset;
}
swift 中
//声明tableView的位置 添加下面代码
if #available(iOS 11.0, *) {
tableView.contentInsetAdjustmentBehavior = .never
tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0)
tableView.scrollIndicatorInsets = tableView.contentInset
}
网友评论