且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

iOS视图置顶的应用:适配iOS12系统上日期控件被筛选视图遮挡问题

更新时间:2022-09-30 13:59:50

引言

本文以pod 'PGDatePicker' ,'2.6.9'·为例子

问题:iOS12系统上日期视图被筛选视图遮挡

思路:利用运行时API修改第三方SDK的内部实现

I、iOS视图置顶方案

让一个View至于最顶端, 避免被其他子视图遮盖住

zPosition : 同级Layer改变显示顺序 bringSubviewToFront: 让指定子视图显示到窗口最前面

https://blog.csdn.net/z929118967/article/details/105298711

CSDN ID:u011018979

昵称:#公号:iOS逆向

II、案例:适配iOS12系统上日期视图被筛选视图遮挡问题

适配iOS12系统上日期视图被筛选视图遮挡问题

背景:为了适配iOS12系统上日期视图被筛选视图遮挡问题

iOS视图置顶的应用:适配iOS12系统上日期控件被筛选视图遮挡问题

方案:修改第三方库日期视图的层级

修改PGDatePickManager,在viewWillLayoutSubviews将contentView和dismissView添加到keyWindow

由于是第三方SDK,可使用自定义类重写viewWillLayoutSubviews,但是推荐在分类使用方法交换进行实现

2.1 自定义类重写viewWillLayoutSubviews

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    
    self.headerView.style = self.style;
    self.dismissView.frame = self.view.bounds;
    self.contentView.backgroundColor = self.datePicker.backgroundColor;
    if (self.style == PGDatePickManagerStyleSheet) {
        [self setupStyleSheet];
    }else if (self.style == PGDatePickManagerStyleAlertTopButton) {
        [self setupStyleAlert];
    }else {
        [self setupStyle3];
    }
//    [self.view bringSubviewToFront:self.contentView];
    [[UIApplication sharedApplication].keyWindow addSubview:_dismissView];
    [[UIApplication sharedApplication].keyWindow addSubview:self.contentView];
}

2.2 在分类使用方法交换让日期视图视图置顶

.h

//PGDatePickManager+ios12.h
#import "PGDatePickManager.h"
NS_ASSUME_NONNULL_BEGIN
@interface PGDatePickManager (ios12)
@end
NS_ASSUME_NONNULL_END

.m

#import "PGDatePickManager+ios12.h"
@implementation PGDatePickManager (ios12)
+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        NSArray *selStringsArray = @[@"viewWillLayoutSubviews"];
        
        
        [selStringsArray enumerateObjectsUsingBlock:^(NSString *selString, NSUInteger idx, BOOL *stop) {
            NSString *mySelString = [@"sd_" stringByAppendingString:selString];
            
            Method originalMethod = class_getInstanceMethod(self, NSSelectorFromString(selString));
            Method myMethod = class_getInstanceMethod(self, NSSelectorFromString(mySelString));
            method_exchangeImplementations(originalMethod, myMethod);
        }];
    });
}
- (void)sd_viewWillLayoutSubviews{
    
    [self sd_viewWillLayoutSubviews];
    
        [UIApplication.sharedApplication.delegate.window bringSubviewToFront:self.view.superview];
}
@end

see also