Superview边框正在切入子视图

时间:2017-03-24 15:36:42

标签: ios uikit

我希望这个子视图延伸到超级视图,但是superview的边框正在切入子视图。有办法防止这种情况吗?

Example

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)
    }   
}

5 个答案:

答案 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")
    }
}

enter image description here

答案 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()
    }

}

结果:

screen shot of result

答案 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