具有自定义层的 UIButton 的子类不会完全填充相邻视图的空间

Posted

技术标签:

【中文标题】具有自定义层的 UIButton 的子类不会完全填充相邻视图的空间【英文标题】:Subclass of UIButton with custom layer doesn't fill space to adjacent view completely 【发布时间】:2015-10-27 20:36:23 【问题描述】:

我试图创建一个带有图标的方形按钮,其中背景是透明的。当按钮突出显示时,背景变为白色。一切正常,但后来我注意到按钮的右侧白色边框在突出显示时不如边框的其余部分清晰。经过一些研究,我意识到只有当右侧的视图设置为“将 X 中心对齐到:Superview”时才会发生这种情况。这是我做的一个例子:

您看到的白色区域是我制作的矩形按钮(代码如下)。请注意,通过按钮和绿色 UIView 之间的小间隙可以看到一些红色背景颜色。绿色视图设置为“Align Center X to: Superview”,并且按钮的尾随空间为 0 到绿色视图。下面蓝色的 UIView 没有遇到这种奇怪的差距。

现在看这张图:

这是完全相同的设置,但现在绿色 UIView 具有“Trailing Space to: Superview = 140”而不是 X 居中。现在差距消失了!为什么会这样?

这是绘制白色按钮的代码。

import UIKit

@IBDesignable
class SquareButton: UIButton 

var iconLayer: CAShapeLayer!

func setup() 
    if iconLayer == nil 
        iconLayer = CAShapeLayer()

        // Create a custom white background color
        let rect = CGRectMake(0.0, 0.0, self.bounds.width, self.bounds.height)
        UIGraphicsBeginImageContext(self.bounds.size)
        let context = UIGraphicsGetCurrentContext()
        CGContextSetFillColorWithColor(context, UIColor.whiteColor().CGColor)
        CGContextFillRect(context, rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext();

        // Set forState .Normal just for this example
        self.setBackgroundImage(image, forState: .Normal)
    



override func layoutSubviews() 
    super.layoutSubviews()
    setup()


override init(frame: CGRect) 
    super.init(frame: frame)


required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)


任何帮助将不胜感激! :D

【问题讨论】:

【参考方案1】:

我最终解决了这个问题,而不是设置白色背景图像,而是创建了一个填充的 CAShapeLayer 并将其作为子图层添加到按钮中。出于某种原因,它起作用了。

【讨论】:

以上是关于具有自定义层的 UIButton 的子类不会完全填充相邻视图的空间的主要内容,如果未能解决你的问题,请参考以下文章

在情节提要上使用 UIButton 子类会使按钮的边框消失

自定义 UIButton 背景图像在点击之前不会出现

具有多个 UIButton 的多个自定义单元格崩溃

具有自定义视图背景的对话框

iOS:自定义按钮(UIButton 的子类) - 无法更改边框属性

iPhone:覆盖 UIButton buttonWithType 以返回子类