我正在尝试在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
没有自动布局约束,因此在添加约束时可能无法正常工作。
这就是我寻找任何其他解决方案的原因。
解决此问题的最佳方法是什么?我应该编写一些代码来处理代码第二部分的自动布局问题吗?或者我应该从不同的角度处理问题?如果是这样,怎么样?
我主要是在寻找有关如何解决问题的建议。
感谢您的帮助!