全局方式解决UIScrollView的contentInset导致的空白问题(SwizzleMethod)

本文介绍在iOS项目中,如何通过创建UIViewController分类并使用方法交换(SwizzleMethod),实现在iOS11及以上的版本中对UIScrollView的contentInsetAdjustmentBehavior属性进行全局设置,以解决ScrollView在不同屏幕尺寸下的布局问题。

        实际项目开发过程中遇到iOS 11中出现的UIScrollView设置问题,经常会需要在每一个用到ScrollView的地方添加上相应代码,这样处理不利于以后项目发展。而全局设置方法有多种,可以选择让项目中的控制器继承同一个控制器,在该控制器下设置,也可以创建控制器分类进行设置,我在这里记录一下创建控制器分类使用方法交换(SwizzleMethod)全局设置的过程。使用xpy_viewDidLoad方法去交换原本viewDidLoad方法。

创建UIViewController分类UIViewController+XPYScrollViewInsets

.m文件中代码如下

#import "UIViewController+XPYScrollViewInsets.h"
#import <objc/runtime.h>


@implementation UIViewController (XPYScrollViewInsets)
//将方法交换过程放在load方法中实现,是因为load方法原则上只会被调用一次
//但也有可能被其他类手动调用,所以可以使用dispatch_once_t来保证方法交换只进行了一次
+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];
        Method originMethod = class_getInstanceMethod(class, @selector(viewDidLoad));
        Method swizzledMethod = class_getInstanceMethod(class, @selector(xpy_viewDidLoad));
        //先将要交换的方法实现加入到原来的方法中去,如果添加失败,说明子类中已经实现了这个方法,就可以直接交换方法实现来达到效果,如果添加成功,说明子类中没有实现这个方法,则可以在添加成功以后替换掉原来的方法,这样就可以保证不影响父类
        BOOL didAddMethod = class_addMethod(class, @selector(viewDidLoad), method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
        if (didAddMethod) {
            class_replaceMethod(class, @selector(xpy_viewDidLoad), method_getImplementation(originMethod), method_getTypeEncoding(originMethod));
        } else {
            method_exchangeImplementations(originMethod, swizzledMethod);
        }
    });
}

- (void)xpy_viewDidLoad {
    [self xpy_viewDidLoad];
    //iOS 11.0以后使用UIScrollView的contentInsetAdjustmentBehavior代替了UIView的automaticallyAdjustsScrollViewInsets,所以需要做判断
    if (@available(iOS 11.0, *)) {
        for (UIView *view in self.view.subviews) {  //遍历子控件得到scrollView,设置scrollView的contentInsetAdjustmentBehavior为UIScrollViewContentInsetAdjustmentNever
            if ([view isKindOfClass:[UIScrollView class]]) {
                UIScrollView *scrollView = (UIScrollView *)view;
                scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
            }
        }
    } else {                                        //直接设置view的automaticallyAdjustsScrollViewInsets为NO
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
}

@end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值