【问题标题】:IBDesignable not working UIButton alignments?IBDesignable 不工作 UIButton 对齐?
【发布时间】:2021-03-22 14:11:58
【问题描述】:

我正在继承 UIButton,试图以编程方式对齐它们,但它不起作用。 同样的事情我可以在 stoaryboard 中对齐它们。为什么它不起作用?

请参阅下面的代码:

  @IBDesignable
class AddProfilePictureView: UIButton {
    
    open var bottomLineLayer : CALayer?
    
    @IBInspectable var textColor:UIColor = .gray{
        didSet{ self.titleLabel?.textColor = textColor }
    }

    @IBInspectable var leftHandImage: UIImage? {
        didSet {
            leftHandImage = leftHandImage?.withRenderingMode(.alwaysOriginal)
            setupImages()
        }
    }
    @IBInspectable var rightHandImage: UIImage? {
        didSet {
            rightHandImage = rightHandImage?.withRenderingMode(.alwaysOriginal)
            setupImages()
        }
    }
    @IBInspectable var bottomLineColor: UIColor = UIColor.lightGray {
        didSet {
            addBottomLine()
        }
    }
    
    @IBInspectable var imageSize: CGFloat = 20{
        didSet {
            setupImages()
        }
    }
    @IBInspectable var titlePadding: CGFloat = 25{
        didSet {
            alignment()
        }
    }
    override init(frame: CGRect) {
         super.init(frame: frame)
        alignment()
     }

     required init?(coder aDecoder: NSCoder) {
         super.init(coder: aDecoder)
        alignment()
     }

     override func prepareForInterfaceBuilder() {
         super.prepareForInterfaceBuilder()
        alignment()
     }
    
    override func titleRect(forContentRect contentRect: CGRect) -> CGRect {
        var tempRect = contentRect
        tempRect.origin.x = titlePadding
        return tempRect
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        addBottomLine()
    }
    func alignment(){
        contentVerticalAlignment = .bottom
    }
    func  addBottomLine(){
//        if bottomLineLayer == nil{
        for layer in self.layer.sublayers  ?? [] {
             if layer.name == "bottom" {
                  layer.removeFromSuperlayer()
             }
         }
            bottomLineLayer = CALayer()
            bottomLineLayer?.name = "bottom"
            bottomLineLayer?.frame = CGRect(x: 0.0, y: self.frame.height + 5, width: self.frame.width, height: 1.0)
            bottomLineLayer?.backgroundColor = bottomLineColor.cgColor
            self.layer.addSublayer(bottomLineLayer ?? CALayer())
//        }
    }
    func setupImages() {
        
        if let rightImage = rightHandImage {
            for views in self.subviews{
                if views.tag == 100{
                    views.removeFromSuperview()
                }
            }
            let rightImageView = UIImageView(image: rightImage)
            rightImageView.tag = 100
            rightImageView.tintColor = .black
            self.addSubview(rightImageView)
            rightImageView.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                rightImageView.trailingAnchor.constraint(equalTo: self.trailingAnchor,constant: 0),
//                rightImageView.centerYAnchor.constraint(equalTo: self.centerYAnchor),
                rightImageView.bottomAnchor.constraint(equalTo: self.bottomAnchor,constant: 0),
                rightImageView.widthAnchor.constraint(equalToConstant: imageSize),
                rightImageView.heightAnchor.constraint(equalToConstant: imageSize)
            ])
        }
        
        if let rightImage = leftHandImage {
            for views in self.subviews{
                if views.tag == 101{
                    views.removeFromSuperview()
                }
            }
            let rightImageView = UIImageView(image: rightImage)
            rightImageView.tintColor = .black
            rightImageView.tag = 101
            self.addSubview(rightImageView)
            rightImageView.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                rightImageView.leadingAnchor.constraint(equalTo: self.leadingAnchor,constant: 0),
//                rightImageView.centerYAnchor.constraint(equalTo: self.centerYAnchor),
                rightImageView.bottomAnchor.constraint(equalTo: self.bottomAnchor,constant: 0),
                rightImageView.widthAnchor.constraint(equalToConstant: imageSize),
                rightImageView.heightAnchor.constraint(equalToConstant: imageSize)
            ])
        }
    }
}

这一行什么都不做

contentVerticalAlignment = .bottom

输出:

【问题讨论】:

    标签: ios swift uibutton


    【解决方案1】:

    问题是你没有调用 layoutSubviews 的超级方法。 试试这个

    override func layoutSubviews() {
        super.layoutSubviews()
        addBottomLine()
    }
    

    【讨论】:

    • 感谢您的回答,但仍然无法正常工作
    • 我试过你的课,当我运行我的应用程序时它工作正常。
    • 有多奇怪?检查我更新的问题并尝试修改代码
    • 使用此代码,您解决了最后一个问题(这是您最初的问题)。对吗?
    • 我解决了左对齐问题,但文本也必须位于底部,这不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2018-06-01
    • 2019-03-05
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多