iOS开发技巧(OC版):关于iOS11适配的一些坑

iOS开发技巧(OC版):关于iOS11适配的一些坑,第1张

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

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

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

原因是少了:

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

因为我是创建的空项目所以只有LaunchScreenstoryboard如果你的项目里还有Mainstoryboard,那么 你需要把第四个勾勾也去掉

区域一: 高度30

区域二:高度14

区域三:高度44

区域五:高度49

区域六:高度14

区域七:高度20

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

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

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

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

待更新

解决方案: 准备一张尺寸:1125 2436的启动,  添加到Assret中

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

解决方案:iOS11弃用了automaticallyAdjustsScrollViewInsets属性,新增contentInsetAdjustmentBehavior来替代它

- (void)createView:(BOOL)useForRendering showRightAway:(BOOL)showRightAway;

{

    if(_view == nil)

    {

        NSString deviceVersion = [self getDeviceVersion];

        if ([deviceVersion isEqualToString:@"iPhone10,3"] || [deviceVersion isEqualToString:@"iPhone10,6"])

        {

            CGRect bounds = CGRectMake(34, 0, 744, 375);

            _window  = [[UIWindow alloc] initWithFrame:bounds];

        }

        else

        {

            _window = [[UIWindow alloc] initWithFrame: _screenbounds];

        }

        _windowscreen = _screen;

        if(_screen == [UIScreen mainScreen])

        {

            _view = [[GetAppController() init] unityView];

            NSAssert([_view isKindOfClass:[UnityView class]], @"You MUST use UnityView subclass as unity view");

        }

        else

        {

            _view = [(useForRendering [UnityRenderingView alloc] : [UIView alloc]) initWithFrame: _screenbounds];

        }

        _viewcontentScaleFactor = UnityScreenScaleFactor(selfscreen);

        [self updateScreenSize];

        if(showRightAway)

        {

            [_window addSubview:_view];

            [_window makeKeyAndVisible];

        }

    }

}

- (NSString)getDeviceVersion

{

    struct utsname systemInfo;

    uname(&systemInfo);

    NSString deviceVersion = [NSString stringWithCString:systemInfomachine encoding:NSUTF8StringEncoding];

    NSLog(@"添加获取手机型号方法 ++ %@", deviceVersion);

    return deviceVersion;

}

- (void)updateScreenSize

{

    CGSize layerSize    = _viewlayerboundssize;

    NSString deviceVersion = [self getDeviceVersion];

    if ([deviceVersion isEqualToString:@"iPhone10,3"] || [deviceVersion isEqualToString:@"iPhone10,6"])

    {

        layerSize = CGSizeMake(744, 375);

    }

    CGFloat scale      = UnityScreenScaleFactor(_screen);

    _screenSize = CGSizeMake(layerSizewidth scale, layerSizeheight scale);

}

在 OC 渲染器中,玻璃材质里面的彩点,可能是指光学现象中的散射、透射、反射等,如果想要调整其表现效果,可以尝试以下 *** 作:

1 调整玻璃材质的参数:打开软件中的渲染器设置,找到玻璃材质相关的参数,如透光度、光折射率、粗糙度等,调整这些参数可以影响散射、透射、反射的效果。

2 添加灯光源:玻璃中的彩点可能是由周围的光源经过材质折射散射形成的,可以尝试在场景中添加光源或调整光源位置和强度,看看是否有所改善。

3 使用后期制作工具:如果以上方法都不行,可以考虑使用后期制作工具对渲染出的图像进行调整,比如使用 Photoshop、After Effects 等软件,对颜色、亮度、对比度等进行调整,达到想要的效果。

总的来说,OC 渲染器是一款强大的渲染工具,可以根据自己的需要进行灵活的调整和 *** 作,只要多多尝试,总能找到解决问题的方法。

OC统计代码执行时间,单位为毫秒

思考的小妮子

简书作者

2018-11-13 10:26IP属地: 上海

double start = CFAbsoluteTimeGetCurrent()1000;

NSLog(@"start time =%f",start );

double end = CFAbsoluteTimeGetCurrent()1000;

NSLog(@"end time =%f",end );

NSLog(@"use time =%f millisecond ", (end-start));

输出结果:

start time =448113226107433960

end time =448113227112819031

use time =1005385071millisecond

1、定义的一个类,里面有一个私有变量mt_,并且在初始化值为"HaHa Ha"。@interface Mobj : NSObject {@privateNSString mt_;}@end@implementationMobj- (id)init {self = [super init];if (self) {mt_ =[[NSString alloc] initWithString:@"Ha Ha Ha"];}return self;}- (void) dealloc {[mt_ release];记得加头文件#import<objc/runtimeh):NSStringstr;Mobj obj =[[Mobj alloc] init];object_getInstanceVariable(obj, "mt_", (void)&str);Ok,这样就实现了私有变量的访问。

//xypointh

#import <Foundation/Foundationh>

@interface xypoint : NSObject

{

int Xpoint;

int Ypoint;

}

-(void)print;

-(void)setIntX: (int)x;

-(void)setIntY: (int)y;

@end

WKWebView是苹果在iOS 8之后推出的框架,关于它比webview的优势这里就不讲了。主要说一下与JS交互的问题,其实WKWebView已经内置了JS与OC的互调、传值等方法,使用起来也非常方便,下面就来细细的探讨一下以及自己遇到过的坑

首先来看下WKWebView的初始化相关设置:

一、导入相关头文件、设置相关代理和属性

二、WKWebView初始化

注意:

楼主遇到的第一个坑:如果JS给OC传值为空,必须写成: postMessage(null),如果什么都不写,方法是调不通的。

1、在viewWillAppear中配置, addScriptMessageHandler name: "这里就是JS的方法,方法名必须统一"

楼主遇到的第二个坑:配置完后必须在 viewWillDisappear 中 remove,否则会造成循环引用,导致crash

2、实现 WKScriptMessageHandler 协议

以上就是JS调OC,JS向OC传值

楼主这里举三个例子:

1: webview加载完成前,将用户信息传给js

2: webview加载完成,将相关信息传给js

3: 调用相册或相机时,将选择的请求后台接口,后台返回地址,将该地址回传给H5,H5将显示到页面上

第一个例子: webView加载完成前传值

因为 evaluateJavaScript 方法默认是在加载完成后调用,所以直接在页面开始加载中调用是传不过去的,这个时候怎么办呢? 我们可以让js端写两个方法, 第一个方法是js端开始向oc端发起信息需求的方法名,当oc端收到该方法名的时候,就去调用js端第二个获取传值的方法,把信息传递过去。

先让JS端写个方法调OC,OC实现方法后在这个方法内部给JS传值

在WKScriptMessageHandler协议中,实现该方法,然后在方法内部给JS传值

注意: 以上就是在Webview加载完成前传值,如果打印没报错,证明传参成功,如果web端没收到,让他把获取到值的方法写到页面中即可。

第二个例子: webView加载完成,传值给js

第三个例子: 传地址给js,js拿到后显示

1:拍照事件

11:将拍的照片请求上传接口,成功返回地址,并传值给H5

2: 从相册中选取照片

22:将相册中选取的照片请求上传接口,成功返回地址,并传值给H5

注意: getPhotoCallback 即为调用的方法名,后面传值格式必须为: ('') , 这里遇到了第三个坑, 如果方法名写为: 名称名称 (例如:hello getPhotoCallback),这种是调不通的,可以写成hello_getPhotoCallback的形式,一般的话最好还是定义一个完整的名称。 刚开始这个问题卡了比较久,一直调不通,在此记录一下

在 viewDidLoad 中注册进度条监听

开始加载网页

加载完成

加载失败

页面跳转失败

progressView懒加载

添加监听观察者

最后别忘记 removeObserver

Demo地址: >

以上就是关于iOS开发技巧(OC版):关于iOS11适配的一些坑全部的内容,包括:iOS开发技巧(OC版):关于iOS11适配的一些坑、oc渲染器玻璃里面的彩点怎么调、oc显示当前毫秒等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9323830.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存