为啥我无法使用具有自动布局的渐变子层来定位我的视图?它没有出现
Posted
技术标签:
【中文标题】为啥我无法使用具有自动布局的渐变子层来定位我的视图?它没有出现【英文标题】:Why am I unable to position my view with a gradient sublayer with Auto Layout? It doesn't show up为什么我无法使用具有自动布局的渐变子层来定位我的视图?它没有出现 【发布时间】:2014-02-25 01:13:38 【问题描述】:我有以下代码来创建一个带有渐变背景的视图(使用子图层),然后将其添加为子视图:
// Add a gradient overlay to make caption more legible (add a little extra to the sides to make it continue over the spacing between view controllers)
UIView *gradientView = [[UIView alloc] init];
gradientView.translatesAutoresizingMaskIntoConstraints = NO;
gradientView.userInteractionEnabled = NO;
// Add the gradient effect
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = gradientView.bounds;
gradient.colors = @[(id)[UIColor colorWithWhite:0.0 alpha:0.0].CGColor,
(id)[UIColor colorWithWhite:0.0 alpha:0.65].CGColor,
(id)[UIColor colorWithWhite:0.0 alpha:0.8].CGColor];
gradient.locations = @[@0.0, @0.77, @1.0];
[gradientView.layer insertSublayer:gradient atIndex:0];
[self.view addSubview:gradientView];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:gradientView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:gradientView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:gradientView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0.0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:gradientView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]];
但是,当我运行它时,什么也没有出现。如果我用框架而不是自动布局设置它,它确实有效。为什么我无法使用自动布局执行此操作?
【问题讨论】:
【参考方案1】:CALayer
s 不遵循自动布局,仅遵循 UIKit 视图。您的渐变层已开始添加,但它可能只有一个零大小的框架。最好的办法是子类UIView
并使用+[UIView layerClass]
返回CAGradientLayer
,然后它将自动匹配自动布局下的视图大小,否则您需要使用layoutSubviews
之类的东西手动定位图层。
【讨论】:
【参考方案2】:配置高度和宽度约束时,为toItem:
参数传递nil
,为第二个属性传递0。我注意到您将常量设置为 0,这意味着您的渐变视图将没有大小。
此外,高度和宽度约束应添加到gradientView
,而不是主视图。
【讨论】:
我以为你总是向它所在的视图添加约束? 规则不是那么直截了当:规则类似于……在所涉及的视图的最近祖先上安装约束,而宽度和高度约束的最近祖先是视图本身。我从记忆中错误地解释了规则。 好吧,为什么我必须通过 nil 呢?它参考 self.view。以上是关于为啥我无法使用具有自动布局的渐变子层来定位我的视图?它没有出现的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 UITableView 单元格的渐变子层没有正确显示?