我希望这个子视图延伸到超级视图,但是superview的边框正在切入子视图。有办法防止这种情况吗?
class TheView : UIView {
let theSubView = UIButton()
override init(frame: CGRect) {
super.init(frame: frame)
layer.borderColor = UIColor.gray.cgColor
layer.borderWidth = 1
clipsToBounds = false
addSubview(theSubView)
theSubView.backgroundColor = UIColor.green
theSubView.frame = CGRect(x: 0, y: -10, width: 50, height: 50)
}
}
答案 0 :(得分:0)
不要使用视图的图层边框,而是自己绘制边框:
class TheView : UIView {
let theSubView = UIButton()
override func draw(_ rect: CGRect) {
UIColor.gray.set()
UIBezierPath(rect: rect).stroke()
}
override init(frame: CGRect) {
super.init(frame: frame)
clipsToBounds = false
isOpaque = false
addSubview(theSubView)
theSubView.backgroundColor = UIColor.green
theSubView.frame = CGRect(x: 0, y: -10, width: 50, height: 50)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
答案 1 :(得分:0)
我认为最好重新设计您的观点结构,以便theView
无需担心其范围之外的内容。
例如,您可以将较大和较小的rect作为子视图。然后将较小的矩形放在较大的矩形上。然后它应该能够覆盖边界线。
答案 2 :(得分:0)
您无法在子视图的内容下显示视图自己的边框。这在(例如)CALayer borderWidth
reference:
它在接收者的内容和子图层之上合成......
解决此问题的一种方法是添加单独的子视图以绘制边框,并将边框绘制视图放在按钮下方。例如:
@IBDesignable
class TheView : UIView {
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
private let borderView = UIView()
private let button = UIButton()
private func commonInit() {
borderView.layer.borderColor = UIColor.gray.cgColor
borderView.layer.borderWidth = 1
borderView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
borderView.frame = bounds
addSubview(borderView)
button.backgroundColor = UIColor.green
button.frame = CGRect(x: 0, y: -10, width: 50, height: 50)
addSubview(button)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
}
结果:
答案 3 :(得分:0)
我也在解决这个问题。即使边缘有圆角。 这是一个解决方案。
将函数添加到UIView的子类:
- (void)addBorderWithRoundedCorners:(UIRectCorner)corner
{
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(cornerRadius, cornerRadius)];
CAShapeLayer *borderLayer = [[CAShapeLayer alloc] init];
borderLayer.path = maskPath.CGPath;
borderLayer.lineWidth = 1.0f;
borderLayer.strokeColor = mainColor.CGColor;
borderLayer.fillColor = [UIColor clearColor].CGColor;
borderLayer.frame = self.bounds;
self.layer.mask = borderLayer;
[self.layer addSublayer:borderLayer];
}
从awakeFromNib调用此函数:
[self addBorderWithRoundedCorners:UIRectCornerAllCorners];
答案 4 :(得分:0)
如果将另一个视图作为参考,以使两个视图现在具有相同的状态(作为另一个视图的子视图),则可以覆盖它们及其框架。您可以选择哪个子视图应该位于前面:
Totals