Frame.size.width不返回正确的UIButton宽度

时间:2016-01-25 17:23:37

标签: ios swift uibutton border

我正在尝试为我的按钮添加顶部和右侧边框,但不是底部或左侧。我查了一下,并通过添加看起来像边框的视图找到了这样做的建议。

    //Add borders
    let topBorder = UIView(frame: CGRectMake(0, 0, editorBox.frame.size.width/3, 1))
    let rightBorder = UIView(frame: CGRectMake(cancel.frame.size.width, 0, 1, cancel.frame.size.height))
    topBorder.backgroundColor = UIColor(red: 220/255.0, green: 220/255.0, blue: 220/255.0, alpha: 1.0)
    rightBorder.backgroundColor = UIColor(red: 220/255.0, green: 220/255.0, blue: 220/255.0, alpha: 1.0)
    cancel.addSubview(topBorder)
    cancel.addSubview(rightBorder)

但最终的模拟器测试如下:

Button border size is not correct

UIButton border size not correct

然而,按钮绝对不是那么大,因为你无法点击它的最右侧。自动布局约束确认按钮不是那么大。

Autolayout constraints

我只是希望每个按钮都有一个边框,它的实际宽度是1/3,如约束中所设置的那样。谁能告诉我发生了什么以及如何解决它?

2 个答案:

答案 0 :(得分:1)

我认为这是一个自动布局问题 - 您的按钮是在布局更改其宽度之前生成的。另一方面,您的边框视图不会更改其宽度,因为它们超出了约束层次结构。

对于这个简单的事情,我认为UIViews有点太多了。我会在问题按钮上添加一些CALayers。

这是一个与CALayer解决方案直接相关的堆栈溢出问题: CALayer: add a border only at one side

答案 1 :(得分:0)

事实证明,另一个答案本身并没有解决我的边界问题。这是我正在使用的代码,基于@tbondwilkinson答案:

    //Add borders
    let borderColor = UIColor(red: 200/255.0, green: 200/255.0, blue: 200/255.0, alpha: 1.0).CGColor
    func formatTopBorder (buttonToFormat: UIButton,borderToFormat: CALayer) {
        buttonToFormat.clipsToBounds = true
        borderToFormat.borderColor = borderColor
        borderToFormat.borderWidth = 2
        borderToFormat.frame = CGRectMake(0, 0, CGRectGetWidth(cancel.frame), 2)
    }
    let topBorder: CALayer = CALayer()
    let topBorder2: CALayer = CALayer()
    let topBorder3: CALayer = CALayer()
    let rightBorder: CALayer = CALayer()
    let leftBorder: CALayer = CALayer()

    formatTopBorder(cancel, borderToFormat: topBorder)
    formatTopBorder(action, borderToFormat: topBorder2)
    formatTopBorder(addSave, borderToFormat: topBorder3)

    rightBorder.borderColor = borderColor
    rightBorder.borderWidth = 2
    rightBorder.frame = CGRectMake(CGRectGetWidth(cancel.frame)-2, 0, 2, CGRectGetHeight(cancel.frame))

    leftBorder.borderColor = borderColor
    leftBorder.borderWidth = 1
    leftBorder.frame = CGRectMake(0, 0, 2, CGRectGetHeight(cancel.frame))

    cancel.layer.addSublayer(topBorder)
    cancel.layer.addSublayer(rightBorder)
    action.layer.addSublayer(topBorder2)
    addSave.layer.addSublayer(topBorder3)
    addSave.layer.addSublayer(leftBorder)

但是如果放在viewDidLoad中,它就不能完美地工作。顶部边框起作用,左边界也起作用。但是,它仍然过早地获得UIButton宽度,导致右边界不起作用:

    rightBorder.frame = CGRectMake(CGRectGetWidth(cancel.frame)-2, 0, 2, CGRectGetHeight(cancel.frame))

CGRectGetWidth(cancel.frame)-2获得正确的右边缘并为边框提供空间,但它在按钮大小调整之前获得宽度。

解决方案:

使用该方法,然后将该代码放在viewDidAppear中。不幸的是,在您的视图出现后,边框会出现一小段时间,但所有边框都是正确的。

如果有人可以发布适用于右边缘边界的代码,该代码在viewDidLoad中运行,请发布它并将其标记为正确。