可重复使用的.xib + cocoa类组件,如何自动调整故事板中的大小和样式superview?

问题描述 投票:0回答:1

我在this guide之后使用.xib和cocoa类的组合实现了可重用的按钮组件

它有效,但有一个问题。为了在我的一个主视图故事板中使用它,我必须先在普通视图中拖动(在问题标题中引用为superview),然后应用我的Button类,使其成为一个按钮。

这是有效的,但初始视图的高度和宽度以及它的白色背景仍然存在,所以当我使用我的组件时,我必须总是手动重写它们,这本身导致可重用性差。

理想情况下,我想拖动视图,将其设置为Button类,就是这样,该视图应立即采用按钮的高度和宽度,并具有透明背景。这样的事情可以实现吗?

为了解决这个问题的更多背景,这里我的实现很少有用

1.可重用组件,作为.xib视图和自己的可可类

enter image description here

2. Button.swift的内容

import UIKit

@IBDesignable class Button: UIView {

    @IBOutlet var contentView: UIView!
    @IBOutlet weak var label: UILabel!

  @IBInspectable var buttonLabel: String? {
    get {
      return label.text
    }
    set(buttonLabel) {
      label.text = buttonLabel
    }
  }

  override init(frame: CGRect) {
    super.init(frame: frame)
    componentInit()
  }

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

  private func componentInit() {
    let bundle = Bundle(for: Button.self)
    bundle.loadNibNamed("Button", owner: self, options: nil)
    addSubview(contentView)
    contentView.frame = self.bounds
    contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
  }

}

3.示例用法(在我的一个主视图故事板中)演示普通视图如何变成按钮,但是有高度,宽度和背景颜色的问题

enter image description here

P.S ^如果很难分辨出上面的gif中发生了什么,我基本上将UIView拖入故事板并给它自定义类属性Button,这将该视图转换为按钮。

编辑:为了使它更清楚,我的问题是:我可以将宽度,高度和透明颜色应用于我的XIB的父/超级视图吗?这里的最终目标是只是将视图拖到故事板上,给它自定义类Button,就是这样,它应该正确调整大小并具有透明背景,而不是现在的情况(视图不会大小)作为按钮,有白色背景)

ios swift xcode cocoa xib
1个回答
1
投票

您必须正确地将您的子视图固定在Button中,也可以固定在Main.storyboard中。然后您的自定义视图将自动调整大小。清晰的颜色正在发挥作用。

import UIKit

@IBDesignable
class Button: UIView {

    @IBOutlet var contentView: UIView!
    @IBOutlet weak var label: UILabel!

    @IBInspectable
    var backColor: UIColor = .clear {
        didSet {
            backgroundColor = backColor
            contentView.backgroundColor = backColor
        }
    }

    override var backgroundColor: UIColor? {
        get {
            return backgroundColor
        } set {

        }
    }

    @IBInspectable
    var buttonLabel: String? {
        get {
            return label.text
        }
        set(buttonLabel) {
            label.text = buttonLabel
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        componentInit()
    }

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

    private func componentInit() {
        let bundle = Bundle(for: Button.self)
        bundle.loadNibNamed("Button", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = bounds
        backgroundColor = backColor
        contentView.backgroundColor = backColor
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        // for static height
        contentView.heightAnchor.constraint(equalToConstant: 70).isActive = true
    }

}

为了确保CustomView能够正确调整大小,您可以使用底部约束> = 0.将重置测试设置为等于。

© www.soinside.com 2019 - 2024. All rights reserved.