使用CALayer和自动布局为UIView创建自定义边框

3

我需要为UIView绘制自定义边框。

我已经有了可以实现此功能的代码,但是这些代码是在我们开始使用自动布局之前编写的。

这段代码基本上是添加一个宽度/高度为1.0f的子层。

-(void)BordeIzquierdo:(UIColor *)pcColor cfloatTamanio:(CGFloat )pcfloatTamanio
{
    CALayer* clElemento = [self layer];
    CALayer *clDerecho = [CALayer layer];
    clDerecho.borderColor = [UIColor darkGrayColor].CGColor;
    clDerecho.borderWidth = pcfloatTamanio;
    clDerecho.frame = CGRectMake(0, 1, pcfloatTamanio, self.frame.size.height);
    [clDerecho setBorderColor:pcColor.CGColor];
    [clElemento addSublayer:clDerecho];
}

现在的问题是,使用自动布局时,这发生在layoutSubViews之前。因此,UIView.layer.frame是(0,0;0,0),因此添加的子层不会显示,因为其宽度/高度=0.0f。
现在我该怎么做才能使此代码无需传输到另一个方法(例如didLayoutSubviews)而执行自定义绘图呢?
我希望这种样式在调用viewDidLoad之前被正确应用。
  • 有没有类似于自动布局约束的东西可以与CALayers一起使用?
  • 还有其他想法吗?
1个回答

5

iOS中没有CALayer的自动调整大小或约束(在Mac OS X中有,但在iOS中没有)。

您的要求有些不合理。您说您拒绝将调用移动到BordeIzquierdo:。但是,在您知道self(因此也是self.layer)的大小之前,您无法给clDerecho赋予正确的大小。Cocoa Touch编程的一半艺术是将代码放在正确的位置。您必须找到适当的位置来调用BordeIzquierdo:,以便所需的值在调用时具有意义。

我会将其与BOOL标志一起放置在layoutSubviews中,以便仅执行一次。


我认为在视图布局之前设置其外观是一个合理的要求 :) 目前无法实现这一点并不意味着它是不合理的,只是在实践中难以达成。我的想法是将设置外观的所有代码放在一个单独的位置,如果没有其他选择,我需要在viewDidLoadlayoutSubviews两个位置上编写代码。 - pgpb.padilla
等一下。这是一个UIView的子类,所以没有viewDidLoad方法。但是有一个layoutSubviews方法。所以那只是一个地方而已。 - matt
另外,是的,很抱歉但我坚持认为与框架对抗是不合理的。你通过让框架使用你来使用框架。 - matt
我尝试按照您的建议在layoutSubviews中添加带有BOOL标志的代码,但第一次调用时,frame为(0,0;0,0),因此新图层无法正确创建并设置了标志,所以第二次什么也不会发生。目前我将保留未经验证的代码,这样可以工作。我只是希望它不会在性能方面给我带来麻烦。 - pgpb.padilla
1
很抱歉第一次关于CGRectZero的问题。但是,您仍然可以使用标志; 一旦它不是CGRectZero并且您可以创建图层,请设置标志。否则,您可能会添加1000个图层! - matt
不确定我做错了什么,但将代码放在“layoutSubviews”中运行得很好。谢谢! - pgpb.padilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接