我什么时候应该在UIViews中设置边框?

时间:2016-09-29 15:18:55

标签: ios objective-c uiview

我有一个UIView没有填满整个屏幕,我想为该视图添加一个顶部边框。但是,我不断收到以下信息:enter image description here

以下是我正在使用的代码:

CGFloat thickness = 4.0f;
CALayer *topBorder = [CALayer layer];
topBorder.frame = CGRectMake(0, 0, self.announcementCard.frame.size.width, thickness);
topBorder.backgroundColor = [UIColor blueColor].CGColor;

我怎么知道为什么边框掉在屏幕上。这是因为我将边框放在UIViews init方法内的视图上。当我这样做时,self.announcementCard.frame.size.width是1000,因此边框离开屏幕的原因。 self.announcementCard.frame.size.width的宽度和高度为1000.原因是因为UIView没有在其init方法中向UIView添加约束。

因此,我的问题是我应该何时拨打上面写的代码? self.announcementCard.frame.size.width何时会向其添加约束并更新其框架?

3 个答案:

答案 0 :(得分:1)

您应该在viewDidLoad方法中添加子视图(或子图层)。但是,如果您使用自动布局,请保留子图层的引用并使用viewDidLayoutSubviews方法更新它:

- (void)viewDidLoad {
  [super viewDidLoad];

  _borderLayer = [CALayer layer];

  [self.view.layer addSublayer:_borderLayer];
}


- (void)viewDidLayoutSubviews {
  [super viewDidLayoutSubviews];

  _borderLayer.frame = CGRectMake(0, 0, self.view.bounds.size.width, 3);
}

否则,您只需clipsToBounds视图即可避免超出界限的子视图。

self.view.clipsToBounds = YES;

答案 1 :(得分:0)

init图形尚未制作完成。您必须将所有配置放在viewDidLoad:的{​​{1}}或viewWillAppear:中的图形对象上。

答案 2 :(得分:0)

简答:

viewWillAppear

当调用viewWillAppear时,您的子视图已经布局并且框架有效。在viewDidLoad中进行基于帧的计算通常会出现问题,因为尚未设置帧。