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
-
解决:
- 自定义 titleView 中重写
- intrinsicContentSize
方法 - 自定义 titleView 的 subviews 采用代码布局
- 自定义 titleView 中重写
// MyTitleView.m
// override
- (CGSize)intrinsicContentSize
{
return UILayoutFittingExpandedSize;
}
// frame
-(void)layoutSubviews
{
[super layoutSubviews];
// 计算 subviews 位置
}
//
网友评论