iOS 采用@available(iOS 11.0, *)适配 iOS11,会引起调用系统相册时,系统界面上移问题


      我们在使用以下方法适配 iOS11,避免滚动视图顶部出现20的空白以及push或者pop的时候页面有一个上移或者下移的异常动画的问题时,会导致一个问题,就是当我们的应用调用系统相册时,引起系统相册界面整体上移。原因是因为:全局设置了如下的方法。

 

  1.  
    if (@available(iOS 11.0, *)) {
  2.  
    [[ UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
  3.  
    }

 

 

我自己的解决方法是       

1. 在进入相册时:

 

  1.  
    if (@available(iOS 11.0, *)) {
  2.  
    [[ UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentAutomatic];
  3.  
    }

 

2. 在选中图片或退出相册时:再重新调用之前的(最上面的)方法,将其设置为

 

UIScrollViewContentInsetAdjustmentNever

 

目前我还没有研究出其它好的方法,如果有人知道其它的方法的话,希望能不吝赐教啊!

 

 

@available 和 #available

2016.05.23 15:26* 字数 686 阅读 1946评论 0

Swift 2.0 中,引入了可用性的概念。对于函数,类,协议等,可以使用@available声明这些类型的生命周期依赖于特定的平台和操作系统版本。而#available用在判断语句中(if, guard, while等),在不同的平台上做不同的逻辑。

@available

用法

@available放在函数(方法),类或者协议前面。表明这些类型适用的平台和操作系统。看下面一个例子:

@available(iOS9, *)funcmyMethod(){// do something}

@available(iOS 9, *)必须包含至少2个特性参数,其中iOS 9表示必须在 iOS 9 版本以上才可用。如果你部署的平台包括 iOS 8 , 在调用此方法后,编译器会报错。

另外一个特性参数:星号(*),表示包含了所有平台,目前有以下几个平台:

iOS

iOSApplicationExtension

OSX

OSXApplicationExtension

watchOS

watchOSApplicationExtension

tvOS

tvOSApplicationExtension

一般来讲,如果没有特殊的情况,都使用*表示全平台。

@available(iOS 9, *)是一种简写形式。全写形式是@available(iOS, introduced=9.0)。introduced=9.0参数表示指定平台(iOS)从 9.0 开始引入该声明。为什么可以采用简写形式呢?当只有introduced这样一种参数时,就可以简写成以上简写形式。同理:@available(iOS 8.0, OSX 10.10, *) 这样也是可以的。表示同时在多个平台上(iOS 8.0 及其以上;OSX 10.10及其以上)的可用性。

另外,@available还有其他一些参数可以使用,分别是:

deprecated=版本号:从指定平台某个版本开始过期该声明

obsoleted=版本号:从指定平台某个版本开始废弃(注意弃用的区别,deprecated是还可以继续使用,只不过是不推荐了,obsoleted是调用就会编译错误)该声明

message=信息内容:给出一些附加信息

unavailable:指定平台上是无效的

renamed=新名字:重命名声明

以上参数具体可以参考官方文档

available

#available用在条件语句代码块中,判断不同的平台下,做不同的逻辑处理,比如:

if#available(iOS 8, *) {// iOS 8 及其以上系统运行}guard#available(iOS 8, *)else{return//iOS 8 以下系统就直接返回}

stackoverflow 相关问题整理

Difference between @available and #available in swift 2.0: @available 和 #available

帖子里面还提到一个问题:@available是编译期间判断的吗?而#available是运行时行为吗?

参考资料

API Availability Checking in Swift 2

Availability checking in Swift 2: backwards compatibility the smart way

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM