iOS11适配的那些坑

1. iOS11 UICollectionView的VerticalScrollIndicator被SectionHeaderView遮盖

  • 原因:iOS11 SectionHeaderView的zPosition = 1,iOS11之前为0

  • 解决:方案1可以在delegate方法willDisplaySupplementaryView中改变zPosition(适用iOS8以上),方案2可以在SectionHeaderView中重写didMoveToWindow方法。

//after iOS8
- (void)collectionView:(UICollectionView *)collectionView willDisplaySupplementaryView:(UICollectionReusableView *)view forElementKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath
{
    if (@available(iOS 11.0, *)) {
        if ([elementKind isEqualToString:UICollectionElementKindSectionHeader]) {
            view.layer.zPosition = 0;
        }
    }
}

//All
- (void)didMoveToWindow
{
    [super didMoveToWindow];
    
    if (@available(iOS 11.0, *)) {
        self.layer.zPosition = 0;
    }
}

2. iOS11 UIToolbar上的subview无法响应事件

  • 原因: UIToolbar的Top subview是_UIToolbarContentView,其可以响应事件。所以导致_UIToolbarContentView下面的视图无法响应事件,如下图所示的UIButton

  • 解决: UIToolbar添加subview之前调用:layoutIfNeeded方法。此外一般使用UIToolbar都是为了其高斯模糊效果,因此在iOS9以后有另外一种方法也可实现相同效果,那就是UIBlurEffect。具体实现如下。

//1. UIToolbar视图层级树

//before iOS10

   | <_UIBarBackground>
   |    | 
   |    | 
   | 

//after iOS10   

   | <_UIBarBackground>
   |    | 
   |    | 
   | 
   | <_UIToolbarContentView>
   |    | <_UIButtonBarStackView>

//2.UIBlurEffect 实现高斯模糊

UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight];
UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect: blurEffect];
[customView addSubview:effectView];
   

【注意】:在iOS10中,如果 UIVisualEffectView 的 superview 有设置 mask 则会失效。此外,superview 的 alpha 小于1时也同样会失效。
测试Demo:VisualEffectiOS10Demo

3. iOS11 UIBarButtonItem 高亮状态下的字体与普通状态不一致

  • 原因:如果 Highlighted 未设 TitleTextAttributes,系统不再默认将 Normal 状态下的文本属性赋值给Highlighted
  • 解决:必须手动设置 Highlighted 下的 TitleTextAttributes
- (UIBarButtonItem *)cancleButtonItem
{
    UIBarButtonItem *cancleItem = [[UIBarButtonItem alloc] initWithTitle:@"取消"
                                                                   style:UIBarButtonItemStylePlain
                                                                  target:self
                                                                  action:@selector(onCancleBarButtonItemClick:)];
    NSDictionary *textAttributes = @{NSFontAttributeName : [UIFont systemFontOfSize:16],
                                     NSForegroundColorAttributeName : [UIColor blackColor]
                                     };
    [cancleItem setTitleTextAttributes:textAttributes forState:UIControlStateNormal];
    // 如果不设置,Highlighted 的文本属性则为系统默认属性。
    [cancleItem setTitleTextAttributes:textAttributes forState:UIControlStateHighlighted];
    
    return cancleItem;
}

4. iOS11 navigationBar 自定义 titleView 设置 Frame 无效

  • 原因:titleView 在iOS11后支持 Autolayout,假如自定义 titleView 中的 subviews 是采用 Autolayout,那么 titleView 其会根据 subviews 自适应尺寸大小来设置, 忽略设置的 Frame
  • 解决:
    1. 自定义 titleView 中重写 - intrinsicContentSize方法
    2. 自定义 titleView 的 subviews 采用代码布局
// MyTitleView.m 

// override
- (CGSize)intrinsicContentSize
{
    return UILayoutFittingExpandedSize;
}

// frame
-(void)layoutSubviews
{
    [super layoutSubviews];
    // 计算 subviews 位置
}
// 

5. 原文地址

你可能感兴趣的:(iOS11适配的那些坑)