Ios UIButton子视图在子类中偏移

Ios UIButton子视图在子类中偏移,ios,swift,uibutton,Ios,Swift,Uibutton,我有一个UIButton子类,用于显示按钮的选定状态。选定状态只是在按钮视图的底部放置一条粗黑线,未选中时隐藏黑线。但是,在UIButton子类中使用此选项时,黑线视图是偏移的。我尝试过使用插图,但我认为这不是问题所在。下面是我的子类: class TabButton: UIButton { private var height:CGFloat = 5 private var selectedIndicator:UIView? override var isSelec

我有一个UIButton子类,用于显示按钮的选定状态。选定状态只是在按钮视图的底部放置一条粗黑线,未选中时隐藏黑线。但是,在UIButton子类中使用此选项时,黑线视图是偏移的。我尝试过使用插图,但我认为这不是问题所在。下面是我的子类:

class TabButton: UIButton {

    private var height:CGFloat = 5
    private var selectedIndicator:UIView?

    override var isSelected: Bool {
        didSet { 
            selectedIndicator?.isHidden = !isSelected 
        }
    }

    fileprivate func initializeSelector(_ frame: CGRect) {
        selectedIndicator = UIView(frame: CGRect(x: 0, y: frame.size.height - height, width: frame.size.width, height: height))
        selectedIndicator?.backgroundColor = UIColor.black 
        self.addSubview(selectedIndicator!)
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        initializeSelector(self.frame)
    }
}
所需的按钮应如下所示:

但实际上它看起来是这样的:


有人能帮我理解这里发生了什么,以及如何解决它吗?谢谢

试试这个,在LayoutSubView中,您会看到最后一帧:

override layoutSubviews() {
    super.layoutSubviews()
    selectedIndicator.frame = CGRect(x: 0, y: frame.size.height - height, width: frame.size.width, height: height)
}

调用
initializeSelector
时,
selectedIndicator
的框架只设置一次。当按钮更改其框架时,它不会更改子视图的框架,您需要手动更新所选指示器的框架

为此,您需要重写
UIView
的方法

override layoutSubviews() {
    super.layoutSubviews()
    selectedIndicator?.frame = CGRect(x: 0, y: frame.size.height - height, width: frame.size.width, height: height)
}

请参阅答案以了解何时调用
layoutSubviews()

此答案错误。通过调用
initializeSelector()
inside
layoutSubviews
您将最终拥有多个(调用的
layoutSubviews
的数量)黑色视图作为按钮的子视图,因为
initializeSelector
插入了一个新的黑色
UIView
作为子视图。您是对的,谢谢;)我是从移动应用程序写的,我没有注意到该方法正在添加视图。我确信他是在从nib唤醒中添加视图。