恩美第二个APP项目人猿星球iOS更新&新特性

iOS开发——ios11、iphoneX适配实记

2017-10-19  本文已影响1153人  YY程序猿

编译器升级xcode9,准备适配一下iphoneX的布局,调试时发现由于一些ios11新特性或者底层变化的原因,xcode9运行出来的项目界面有bug,下面做一下新特性适配和iphoneX布局适配的记录。

ios11新特性

UIScrollView新特性
UITbaleView自动增加了内边距.jpeg
if (@available(iOS 11.0, *))//表示只在ios11以上的版本执行
{
    _brandTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
正常时效果.png
UISearchBar新特性
UISearchBar的bug.jpeg
UITableView使用MJRefreshAutoNormalFooter上拉刷新时页面会跳动
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 200;
}

尽量给出较接近实际cell高度的数值,跳动问题会消失。

    if (@available(iOS 11.0, *))//表示只在ios11以上的版本执行
    {
        tableview.estimatedRowHeight = 0;
        tableview.estimatedSectionHeaderHeight = 0;
        tableview.estimatedSectionFooterHeight = 0;
    }
导航栏返回按钮偏移、自定义按钮难以点中
返回按钮偏移bug.jpeg
[self addCustomBackButtonWithBackButtonColor:UIColorFromRGB(0x979797)];

分类.m文件代码如下:

#import "UIViewController+YYBackBarButton.h"
#import "UIImage+extend.h"

@implementation UIViewController (YYBackBarButton)

- (void)addCustomBackButtonWithBackButtonColor:(UIColor *)backButtonColor
{
    self.navigationController.navigationBar.tintColor = [UIColor clearColor];//返回按钮颜色
    self.navigationController.navigationBar.backItem.hidesBackButton = YES;//隐藏返回按钮
    self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;//开启手势右滑返回
    
    //创建返回按钮
    UIButton *backButton = [[UIButton alloc] init];
    backButton.frame = CGRectMake(0, 0, 13, 22);
    [backButton setImage:[[UIImage imageNamed:@"backButton.png"] imageWithColor:backButtonColor] forState:UIControlStateNormal];//imageWithColor这个方法是UIImage+extend分类里的方法,作用是对图片的颜色进行自定义渲染(说白了就是改图片颜色)
    backButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
    //返回按钮偏移值,根据自己的需要设置偏移,已达到想要的UI效果
    CGFloat insetNumber = 0;
    if (@available(iOS 11.0, *))
    {
        if (kMainScreenHeight == IPHONE_4_SCREEN_HEIGHT) insetNumber = 8;
        else if (kMainScreenHeight == IPHONE_5_SCREEN_HEIGHT) insetNumber = 8;
        else if (kMainScreenHeight == IPHONE_6_SCREEN_HEIGHT) insetNumber = 8;
        else if (kMainScreenHeight == IPHONE_6PLUS_SCREEN_HEIGHT) insetNumber = 12;
        else if (kMainScreenHeight == IPHONE_X_SCREEN_HEIGHT) insetNumber = 8;
    }
    else
    {
        if (kMainScreenHeight == IPHONE_4_SCREEN_HEIGHT) insetNumber = 8;
        else if (kMainScreenHeight == IPHONE_5_SCREEN_HEIGHT) insetNumber = 8;
        else if (kMainScreenHeight == IPHONE_6_SCREEN_HEIGHT) insetNumber = 8;
        else if (kMainScreenHeight == IPHONE_6PLUS_SCREEN_HEIGHT) insetNumber = 12;
        else if (kMainScreenHeight == IPHONE_X_SCREEN_HEIGHT) insetNumber = 8;
    }
    [backButton setImageEdgeInsets:UIEdgeInsetsMake(0, -insetNumber, 0, insetNumber)];
    
    //添加按钮事件
    [backButton addTarget:self action:@selector(customClickBackButton) forControlEvents:UIControlEventTouchUpInside];

    //添加手势,获取点击,避免不容易点中返回按钮的问题
    [self.navigationController.navigationBar addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickNavBar:)]];
    
    //把按钮设置为导航栏左边按钮
    UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];
    self.navigationItem.leftBarButtonItem = leftBarButtonItem;
}

- (void)customClickBackButton
{
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)clickNavBar:(UITapGestureRecognizer *)tap
{
    //获取手势的点
    CGPoint tapPoint = [tap locationInView:self.navigationController.navigationBar];
    if (tapPoint.x <= kMainScreenWidth * 0.15)//如果手势的点在左边15%,就让它出发返回按钮事件
    {
        [self customClickBackButton];
    }
}

@end

其中有个图片重新渲染颜色的方法,我写在了UIImage+extend这个分类中,可以改一张图片的整体颜色,方法实现如下:

- (UIImage *)imageWithColor:(UIColor *)color
{
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, 0, self.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextSetBlendMode(context, kCGBlendModeNormal);
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    CGContextClipToMask(context, rect, self.CGImage);
    [color setFill];
    CGContextFillRect(context, rect);
    UIImage*newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

这样处理之后的效果,就跟以前一样了:


解决后效果.jpeg
键盘新特性
IQKeyboardManager键盘工具栏bug.jpeg
XCode9运行访问系统相册崩溃问题
保存图片崩溃.jpeg

iphoneX适配

主要是UI方面的适配,但也发现了一个不明原因的bug。

bug的解决

iphoneX上的bug.gif
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // 重写super
    [super pushViewController:viewController animated:animated];

    // 修改tabBra的frame
    if (isIPhoneX)//解决push时tabbar瞬间上移的问题
    {
        CGRect frame = self.tabBarController.tabBar.frame;
        frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height;
        self.tabBarController.tabBar.frame = frame;
    }
}

即可恢复正常状态。

UI适配

主要是statusBar(顶部状态栏)的高度不一样了、底部增加了一个安全距离。适配思路就是避开这些地方,具体思路下文分开介绍。

顶部状态栏的问题
顶部遮挡.png
底部安全距离的问题
iphoneX上tabbar.png

备注

1、干货分享:对于手机型号的判断、底部高度、顶部高度等,我都写成了宏,需要的朋友拿走不谢:

//是否是手机
#define isIPhone (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
//是否是iphoneX
#define isIPhoneX (kMainScreenWidth >= 375.0f && kMainScreenHeight >= 812.0f && isIPhone)
//苹果X宽高
#define IPHONE_X_SCREEN_WIDTH 375
#define IPHONE_X_SCREEN_HEIGHT 812
//底部安全高度
#define BOTTOM_SAFE_HEIGHT (isIPhoneX ? 34 : 0)
//系统手势高度
#define SYSTEM_GESTURE_HEIGHT (isIPhoneX ? 13 : 0)
//tabbar高度
#define TABBAR_HEIGHT (49 + BOTTOM_SAFE_HEIGHT)
//状态栏高度
#define STATUS_HEIGHT (isIPhoneX ? 44 : 20)
//导航栏高
#define NAVBAR_HEIGHT 44
上一篇下一篇

猜你喜欢

热点阅读