我使用iOS 10 Beta 7和Xcode 8 beta测试了我的应用程序,一切正常。然而就在几分钟前,我安装了现在可用的两种GM版本,并遇到了一个奇怪的问题。
我在我的应用和自定义单元格中使用自定义表格视图单元格我正在使用cornerRadius
和clipsToBounds
创建圆角视图。
- (void)awakeFromNib {
[super awakeFromNib];
self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2;
self.tag2label.clipsToBounds=YES;
}
这看起来还不错,然而在新的GM版本中,圆角的所有视图都消失了。发生在UIView
,UILabels
和UIButtons
。
我在下面解决了这个问题。
答案 0 :(得分:75)
我不确定这是否是新要求,但我在执行任何[self layoutIfNeeded];
之前添加cornerRadius
解决了这个问题。所以我的新自定义awakeFromNib
看起来像这样:
- (void)awakeFromNib {
[super awakeFromNib];
[self layoutIfNeeded];
self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2;
self.tag2label.clipsToBounds=YES;
}
现在他们看起来都很好。
答案 1 :(得分:2)
使用cornerRadius = height / 2修复不可见的视图创建类别UIView + LayoutFix
在文件UIView + LayoutFix.m中添加代码:
cachedVector
将类别添加到YourProject.PCH文件中。
只有在视图中使用[super awakeFromNib]时才会有效:
MyView.m
- (void)awakeFromNib {
[super awakeFromNib];
[self layoutIfNeeded];
}
答案 2 :(得分:1)
cornerRadius
本身效果很好,但帧上的大小报错了。这就是layoutIfNeeded
解决问题的原因。
答案 3 :(得分:1)
我在迁移到TVOS 10时遇到了同样的问题。删除自动布局限制并在故事板中使用新的自动调整设置解决了这个问题。
我的观察是iOS 10 / TVOS 10在调用awakeFromNib之前没有布局基于自动布局的视图,而是在调用相同的方法之前使用自动调整掩码来布局视图。
答案 4 :(得分:0)
您可以像这样创建视图的子类:
@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
所以你总是有正确的圆角。
我使用这种方法并没有问题升级到Xcode8和iOS10。
答案 5 :(得分:0)
您还可以在调试视图层次结构中查看该视图,但无法在应用中看到它。
您必须在受影响的蒙面/剪辑视图上调用layoutIfNeeded
。
(例如,如果你有一个UIImageView
而你在其图层上执行masksToBounds
,则无法在应用中看到该视图等。)