2017-10-09 16:33:02 CrazyDuang 阅读数 1470

1.UITableview UICollectionView MJRefresh下拉刷新错乱

    [UITableView appearance].estimatedRowHeight = 0;
    [UITableView appearance].estimatedSectionHeaderHeight = 0;
    [UITableView appearance].estimatedSectionFooterHeight = 0;
    if (@available(iOS 11, *)) {
        [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; //iOS11 解决SafeArea的问题,同时能解决pop时上级页面scrollView抖动的问题
    }

2.定位权限的授权

ios11开始,不管你是需要在使用时定位还是后台一直定位,.plist文件里面必须将Privacy - Location Always and When In Use Usage Description、Privacy - Location When In Use Usage Description、Privacy - Location Usage Description这几个key添加进去,如果需要后台持续定位需要添加Privacy - Location Always Usage Description这个key,如果没有key没有添加完整系统则不会弹出允许定位的那个提示框,则无法授予定位权限.

如图:

现在授权可以由用户选取了,更加人性化.


3.UIScrollerView的contentInsetAdjustmentBehavior

IOS11 之前,不想让scrollView偏移64px,设置automaticallyAdjustsScrollViewInsets=NO就可以了。IOS11以后就废弃了,使用scrollView的属性contentInsetAdjustmentBehavior来防止偏移。

UIScrollViewContentInsetAdjustmentAutomatic
UIScrollViewContentInsetAdjustmentScrollableAxes
UIScrollViewContentInsetAdjustmentNever
UIScrollViewContentInsetAdjustmentAlways

这里我们直接选Never就可以了,可以参照上面的点1 在Appdelegate-didFinishLaunchingWithOptions里面进行全局设置.

if (@available(iOS 11, *)) {
        [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; //iOS11 解决SafeArea的问题,同时能解决pop时上级页面scrollView抖动的问题
    }

4.iphoneX的导航条,状态条的尺寸

因为iphoneX刘海的出现,X上面的状态栏的高度从20变成44,整个导航条的高度就变成了88.底部tabbar变为了49+34,其余机型还是跟以前一样.如果项目里隐藏了导航栏加了自定义按钮之类的,这里需要注意适配一下.


现在就遇到这些坑,欢迎大家指正补充,后续遇到会继续怼上来滴!!!

2017-10-12 09:55:24 autom_lishun 阅读数 1490

1、iOS 11之前的导航栏的高度是64px(状态条+导航栏),iOS11之后如果设置了prefersLargeTitles = YES(默认NO)则为96pt。所以一般不用管。

2、在iOS 11上运行tableView向下偏移64px或者20px,因为iOS 11废弃了automaticallyAdjustsScrollViewInsets,而是给UIScrollView增加了contentInsetAdjustmentBehavior属性。避免这个坑的方法是要判断

1
2
3
4
5
if (@available(iOS 11.0, *)) {
_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}else {
self.automaticallyAdjustsScrollViewInsets = NO;
}

3、tableView的sectionHeader、sectionFooter高度与设置不符,因为tableView的estimatedRowHeight、estimatedSectionHeaderHeight、 estimatedSectionFooterHeight三个高度估算属性由默认的0变成了UITableViewAutomaticDimension。最简单的方法就是直接设置为0。

4、iPhone X状态条由20px变成了44px,UITabBar由49px变成了83px。设置布局时y直接写成64的就要根据机型设置。可以设置宏

#define Device_Is_iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO),

然后再设置。

2017-12-22 15:05:23 Maxdong24 阅读数 1064

安全区域(Safe Area)
在iOS11以前, 自定义UIViewController时, 从来没有考虑过topLayoutGuide和bottomLayoutGuide这两个属性.但是在iOS11出来之后,这两个属性被废弃,取而代之的就是safeArea的概念,safeArea是描述你的视图部分不被任何内容遮挡的方法。 它提供两种方式:safeAreaInsets或safeAreaLayoutGuide来提供给你safeArea的参照值,即 insets 或者 layout guide。 safeArea区域如图所示:

iPhone X图
在除了iPhone X以外的型号手机上, UINavigationController 就是 topLayoutGuide区域. UITabBarController就是bottomLayoutGuide.但是这两个属性在iOS11已经被取代了. 取而代之的就是safeArea区域(iPhone X图区域4部分)

当我们自定义一个UIViewController, 内部嵌套了UINavigationController 或者UITabBarController的时候. 运行程序会出现以下错误:

图1-1
原因是少了:

具体是为什么,没有细研究.不过解决办法如下:

图1-2
因为我是创建的空项目所以只有LaunchScreen.storyboard..如果你的项目里还有Main.storyboard,那么 你需要把第四个勾勾也去掉.

iPhone X 竖屏UINavigationController和UITabBarController尺寸问题

iPhone X竖屏
区域一: 高度30

区域二:高度14

区域三:高度44

区域五:高度49

区域六:高度14

区域七:高度20

iOS横屏UITabBarController
更新iOS11以后, UITabBarController上的图标文字由原来的垂直放置, 变成水平放置

iPhone X 横屏UINavigationController和UITabBarController尺寸问题

iPhone X横屏
iPhone X 横竖屏在尺寸上有很多细微的差别.

UINavigationController
我们打印UINavigationController navigationBar的时候发现他的高度为44.也就是上图绿色区域.但是在实际显示的时候确实红色区域,高度为32.整个高度向上12.也就是蓝色区域.

UITabBarController
我们打印UITabBarController tabBar的时候发现他的高度为32,就是橘色区域,红色区域为功能区,高度为21.我们是何止tabBar颜色的时,包括橘色区和红色区.

控制大标题的显示
待更新

屏幕未充满?底部tabbar留白
解决方案: 准备一张尺寸:1125 * 2436的启动图片, 添加到Assret中

iOS11导航栏自定义按钮偏移问题
解决方案: 通过改变按钮的 contentEdgeInsets和imageEdgeInsets的值成功改变了按钮的偏移问题,单独设置contentEdgeInsets也可达到一定的效果。

UITableview UICollectionView MJRefresh下拉刷新错乱
解决方案:iOS11弃用了automaticallyAdjustsScrollViewInsets属性,新增contentInsetAdjustmentBehavior来替代它

2017-12-19 15:25:00 qq_29892943 阅读数 1670

、iOS 11之前的导航栏的高度是64px(状态条+导航栏),iOS11之后如果设置了prefersLargeTitles = YES(默认NO)则为96pt。所以一般不用管。

、在iOS 11上运行tableView向下偏移64px或者20px,因为iOS 11废弃了automaticallyAdjustsScrollViewInsets,而是给UIScrollView增加了contentInsetAdjustmentBehavior属性。避免这个坑的方法是要判断

if (@available(iOS 11.0, *)) {
_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}else {
self.automaticallyAdjustsScrollViewInsets = NO;
}

、tableView的sectionHeader、sectionFooter高度与设置不符,因为tableView的estimatedRowHeight、estimatedSectionHeaderHeight、 estimatedSectionFooterHeight三个高度估算属性由默认的0变成了UITableViewAutomaticDimension。最简单的方法就是直接设置为0。

、iPhone X状态条由20px变成了44px,UITabBar由49px变成了83px。设置布局时y直接写成64的就要根据机型设置。可以设置宏

#define Device_Is_iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO),

然后再设置。
、MJRefresh在iOS11.0瞬间刷新
升级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  
} 

IScrollViewContentInsetAdjustmentBehavior 是一个枚举类型,值有以下几种:

-automatic 和scrollableAxes一样,scrollView会自动计算和适应顶部和底部的内边距并且在scrollView 不可滚动时,也会设置内边距.

-scrollableAxes 自动计算内边距.

-never不计算内边距

-always 根据safeAreaInsets 计算内边距

很显然,我们这里要设置为 never
解决方法:

 //声明tableView的位置 添加下面代码  
        if (@available(iOS 11.0, *)) {  
            _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;  
            _tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0);  
            _tableView.scrollIndicatorInsets = _tableView.contentInset;  
        }  

还有可能只设置一下never:

        if (@available(iOS 11.0, *)) {  
            _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;  

.用UISearchController创建的搜索器跳转控制器(巨坑,超后悔),在iOS11有个问题,searchBar的placeholder属性,文字居左,默认是居中的。

解决方法一:
实现方法,自定义UISearchBar:

//  placeholder 和icon 和 间隙的整体宽度
// @property (nonatomic, assign) CGFloat placeholderWidth;

//  在layoutSubviews里默认先居中
if (@available(iOS 11.0, *)) {
        [self setPositionAdjustment:UIOffsetMake((field.frame.size.width-self.placeholderWidth)/2, 0) forSearchBarIcon:UISearchBarIconSearch];
 } 

// 实现textfield的代理方法
// 开始编辑的时候重置为靠左
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
// 继续传递代理方法
     if ([self.delegate respondsToSelector:@selector(searchBarShouldBeginEditing:)]) {
        [self.delegate searchBarShouldBeginEditing:self];
    }
    if (@available(iOS 11.0, *)) {
        [self setPositionAdjustment:UIOffsetZero forSearchBarIcon:UISearchBarIconSearch];
    }
    return YES;
}

// 结束编辑的时候设置为居中
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField {
     if ([self.delegate respondsToSelector:@selector(searchBarShouldEndEditing:)]     {
        [self.delegate searchBarShouldEndEditing:self];
    }
    if (@available(iOS 11.0, *)) {
        [self setPositionAdjustment:UIOffsetMake((textField.frame.size.width-self.placeholderWidth)/2, 0) forSearchBarIcon:UISearchBarIconSearch];
    }
    return YES;
}

解决方法二:
非跳转状态下


self.searchC.searchBar.searchTextPositionAdjustment = UIOffsetMake((CGRectGetWidth(self.searchC.searchBar.frame)-6

点击跳转时,再让文字居左。

self.searchC.searchBar.searchTextPositionAdjustment = UIOffsetMake(0, 0);

.如果我们自己创建tableview而不是继承自uitableviewcontroller的话,那么当我们选择UITableViewStyleGrouped组模式时,我们设置heightForFooterInSection和heightForHeaderInSection不起作用了。
解决方法:当我们设置UITableViewStyleGrouped模式时,那么这时候系统会自动为我们生成一个具有frame的viewForFooter和viewForHeader。因此我们需要手动设置viewForFooterInSection和viewForHeaderInSection。

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 5;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 5;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
    UIView *view=[[UIView alloc] init];
    view.backgroundColor = [UIColor clearColor];
    return view;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{

    UIView *view=[[UIView alloc] init];
    view.backgroundColor = [UIColor clearColor];
    return view;
}

自定义的tableview死活不走代理方法
问题:

-(id)initWithData:(NSDictionary *)data{
    self = [super init];
    if (self) {
        self.delegate = self;
        self.dataSource = self;
        self.layer.cornerRadius = 5.0;
        self.layer.masksToBounds = YES;
        self.scrollEnabled = NO;
        self.tag = 101;
    }
    return self;
}

解决方法:其实就是上面的第三条,自定义的tableview要设置三个属性,不然就不走。。。。。

-(id)initWithData:(NSDictionary *)data{
    self = [super init];
    if (self) {
        self.delegate = self;
        self.dataSource = self;

        if (@available(iOS 11.0, *)) {
            self.estimatedSectionHeaderHeight = 0;
            self.estimatedSectionFooterHeight = 0;
            self.estimatedRowHeight = 0;
        }

        self.layer.cornerRadius = 5.0;
        self.layer.masksToBounds = YES;
        self.scrollEnabled = NO;
        self.tag = 101;

    }
    return self;
}
2017-09-26 00:00:00 olsQ93038o99S 阅读数 445

IOS11 适配遇到的坑

阅读数 16818

ios填坑

阅读数 50

没有更多推荐了,返回首页