对于很多关于ios11适配中我都看到一段代码:
#define adjustsContentInsets(scrollView)\
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
if ([UIScrollView instancesRespondToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
[scrollView performSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:") withObject:@(2)];\
}\
_Pragma("clang diagnostic pop") \
} while (0)
对于下面的这段代码能否生效表示怀疑。
performSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:") withObject:@(2)]
因此做个简单的测试如下:
4.png
其中默认不带开测试1和测试2的结果如下:
1.png为了显示scrollview的具体content的位置我对界面稍微往下拖动了大概1个像素,用来显示右边的滚动指示器。
打开测试1代码的结果如下:
2.png
打开测试2代码的结果如下:
3.png
如果
performSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:") withObject:@(2)]
这段代码能够生效,测试1和测试2的结果应当是一样的吧?
这边修改了一下上面的代码,就能正常使用了。
#define adjustsScrollViewInsets_NO(scrollView,vc)\
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
if ([UIScrollView instancesRespondToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
NSMethodSignature *signature = [UIScrollView instanceMethodSignatureForSelector:@selector(setContentInsetAdjustmentBehavior:)];\
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];\
NSInteger argument = 2;\
invocation.target = scrollView;\
invocation.selector = @selector(setContentInsetAdjustmentBehavior:);\
[invocation setArgument:&argument atIndex:2];\
[invocation invoke];\
} else {\
vc.automaticallyAdjustsScrollViewInsets = NO;\
}\
_Pragma("clang diagnostic pop") \
} while (0)
网友评论