使用xcode 8 GM的iOS 10 GM会导致视图由于roundedCorners&clipsToBounds而消失

我testing了我的应用程序与iOS 10 Beta 7和Xcode 8testing版,一切正常。 然而就在几分钟前,我安装了现在可用的通用版本,面临一个奇怪的问题。

我在我的应用程序和我的自定义单元格中使用自定义表格视图单元格我使用cornerRadiusclipsToBounds创build四舍五入的意见。

 - (void)awakeFromNib { [super awakeFromNib]; self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2; self.tag2label.clipsToBounds=YES; } 

然而,在新的通用汽车发布之前,这看起来还不错,所有圆angular的视图都消失了。 这发生在UIViewUILabelsUIButtons

我解决了这个下面。

我不确定这是否是新的要求,但是我通过添加[self layoutIfNeeded];来解决这个问题[self layoutIfNeeded]; 之前做任何cornerRadius东西。 所以我新的自定义awakeFromNib看起来像这样:

 - (void)awakeFromNib { [super awakeFromNib]; [self layoutIfNeeded]; self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2; self.tag2label.clipsToBounds=YES; } 

现在他们都显得很好。

用cornerRadius = height / 2修复不可见的视图,创buildUIView + LayoutFix类别

在文件UIView + LayoutFix.m中添加代码:

 - (void)awakeFromNib { [super awakeFromNib]; [self layoutIfNeeded]; } 

将类别添加到YourProject.PCH文件。

它只会在你的视图中使用[super awakeFromNib]时才有效:

MyView.m

 - (void)awakeFromNib { [super awakeFromNib]; ... } 

cornerRadius本身工作得很好,但框架上的大小报告不正确。 这就是为什么layoutIfNeeded解决了这个问题。

我在转移到TVOS 10时遇到了同样的问题。删除自动布局限制并在故事板中使用新的Autoresizing设置为我解决了这个问题。

自动调整设置面板

我的观察是,在调用awakeFromNib之前,iOS 10 / TVOS 10没有布置基于自动布局的视图,而是在调用相同的方法之前使用自动调整遮罩布局视图。

你可以像这样创build你的视图的子类:

 @implementation RoundImageView - (instancetype)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self) { self.layer.masksToBounds = YES; self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2; [self addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew context:(__bridge void * _Nullable)(self)]; } return self; } -(void)dealloc { [self removeObserver:self forKeyPath:@"bounds" context:(__bridge void * _Nullable)(self)]; } -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { if(context == (__bridge void * _Nullable)(self) && object == self && [keyPath isEqualToString:@"bounds"]) { self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2; } } @end 

所以你总是有适当的圆angular。

我使用这种方法,并没有升级到Xcode8和iOS10的问题。

您也可以在debugging视图层次结构中看到该视图,但无法在应用程序中看到它。

您必须在受影响的蒙版/剪辑视图上调用layoutIfNeeded

(例如,如果你有一个UIImageView ,你在它的图层上做了masksToBounds ,并且你不能在应用中看到这个视图等)