iOS描边图层超出界限

时间:2014-03-10 13:21:48

标签: ios uiview core-graphics calayer quartz-core

我正在尝试在UIView上构建一个类别方法以允许笔划UIView,类似于Photoshop功能: Stroke-Outside 。虽然CALayer属性borderWidth和borderColor在内部完美地工作,但我找不到在外面描边视图的好方法。

这是我最初提出的解决方案:

使用子图层我添加另一个CALayer,其框架大于超级图层的边界。然后将该图层插入UIView的子图层中。

- (void)strokeViewWithColor:(UIColor *)color borderWidth:(CGFloat)borderWidth
{
    CALayer *borderLayer = [CALayer layer];
    CGRect borderFrame = CGRectMake(-borderWidth, -borderWidth, (self.frame.size.width) + (borderWidth * 2), (self.frame.size.height) + (borderWidth * 2));
    [borderLayer setBackgroundColor:[[UIColor clearColor] CGColor]];
    [borderLayer setFrame:borderFrame];

    //
    // Copy current border layer radius
    //
    [borderLayer setCornerRadius:self.layer.cornerRadius];

    [borderLayer setBorderWidth:borderWidth];
    [borderLayer setBorderColor:[color CGColor]];

    [self.layer addSublayer:borderLayer];
}

这适用于将图层属性UIView或视图属性masksToBounds设置为clipsToBounds的所有NO。但是这会禁用使用我想要的cornerRadius属性的功能。

所以我的第二次尝试是使用UIView,因为显然我必须走出我想要描边的视图(同样的逻辑可以应用于我假设的图层和超层关系)。

我提出了这个解决方案:

- (void)strokeViewWithColor:(UIColor *)color borderWidth:(CGFloat)borderWidth
{
    UIView* superview = self.superview;

    //
    // Fix frame
    //

    CGRect frame = self.frame;
    frame.origin.x -= borderWidth;
    frame.origin.y -= borderWidth;
    frame.size.width += (2 * borderWidth);
    frame.size.height += (2 * borderWidth);

    UIView* strokeView = [[UIView alloc] initWithFrame:frame];
    strokeView.layer.borderWidth = borderWidth;
    strokeView.layer.cornerRadius = self.layer.cornerRadius + borderWidth;
    strokeView.layer.borderColor = [color CGColor];

    [superview insertSubview:strokeView aboveSubview:self];
}

这样可行,但问题出在自动布局上。由于strokeView没有自动布局约束,因此在添加约束时可能无法正常工作。

这就是我寻找任何其他解决方案的原因。

解决此问题的最佳方法是什么?我应该编写一些代码来处理代码第二部分的自动布局问题吗?或者我应该从不同的角度处理问题?如果是这样,怎么样?

我主要是在寻找有关如何解决问题的建议。

感谢您的帮助!

0 个答案:

没有答案