iOS 10 GM与xcode 8 GM导致视图因roundCorners&而消失clipsToBounds

时间:2016-09-07 22:49:41

标签: ios objective-c ios10

我使用iOS 10 Beta 7和Xcode 8 beta测试了我的应用程序,一切正常。然而就在几分钟前,我安装了现在可用的两种GM版本,并遇到了一个奇怪的问题。

我在我的应用和自定义单元格中使用自定义表格视图单元格我正在使用cornerRadiusclipsToBounds创建圆角视图。

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

这看起来还不错,然而在新的GM版本中,圆角的所有视图都消失了。发生在UIViewUILabelsUIButtons

我在下面解决了这个问题。

6 个答案:

答案 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时遇到了同样的问题。删除自动布局限制并在故事板中使用新的自动调整设置解决了这个问题。

Autoresizing settings panel

我的观察是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,则无法在应用中看到该视图等。)