美文网首页
iOS11适配的那些坑

iOS11适配的那些坑

作者: BytePorter | 来源:发表于2018-02-09 14:33 被阅读0次

    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
    <UIToolbar>
       | <_UIBarBackground>
       |    | <UIImageView>
       |    | <UIVisualEffectView>
       | <UIButton>
    
    //after iOS10   
    <UIToolbar>
       | <_UIBarBackground>
       |    | <UIImageView>
       |    | <UIVisualEffectView>
       | <UIButton>
       | <_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适配的那些坑

          本文链接:https://www.haomeiwen.com/subject/pcwftftx.html