在哪里为基于iOS库对象的自定义视图添加子视图和约束

时间:2015-11-06 11:46:25

标签: ios objective-c uiview uilabel uislider

我想制作一个这样的自定义视图:

enter image description here

如您所见,此视图仅依赖于iOS库中的对象:UILabel和UISlider。 我想添加尽可能多的"元素" (名称+滑块+百分比)我想要的。所以我想创造一个"单位"像这样看:

enter image description here

然后,以编程方式添加我想要的数字。

所以,为此,我必须创建一个新的UIView文件,但是,我在哪里添加UILabel,UISlider?在initWithFrame方法中?约束是否也放在这个方法中?或者在" viewDidLoad"方法?

感谢您的指导

2 个答案:

答案 0 :(得分:1)

只需创建一个自定义初始化。 例如:

   -(instancetype)initWithLabelText:(NSString*)text andSliderValue:(NSInteger)sliderValue {...}

在自定义视图类中,您具有滑块和标签的全局属性。使用传递的值初始化。更改滑块值的方法以及添加到该类的标签

答案 1 :(得分:0)

创建一个新类并使其继承自UIView 然后为要控制的所有UI元素创建公共属性。或者,将UI元素设为私有,并为其值提供公共对应元素 覆盖layoutSubviews()以将UI元素添加为子视图(确保您不会通过检查nil多次添加它们)并更新其帧。 或者,在init函数中添加它们,如果您不想处理帧,则添加自动布局约束。

这是一个很好的起点:

class CustomView: UIView {

    // MARK: -------------------------
    // MARK: Properties

    var nameLabel: UILabel!
    var slider: UISlider!
    var percentLabel: UILabel!

    // MARK: -------------------------
    // MARK: Initialization

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

        // Anything that needs to be initialized when loaded from xib or storyboard
    }

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

        // Anything that needs to be initialized when loaded programatically
    }

    // MARK: -------------------------
    // MARK: Layout

    override func layoutSubviews() {
        super.layoutSubviews()

        if nil == nameLabel {
            nameLabel = UILabel(frame: CGRectZero)
            // Set other attributes here
            addSubview(nameLabel)
        }

        // Update the name label frame here

        if nil == slider {
            slider = UISlider(frame: CGRectZero)
            // Set other attributes here
            addSubview(slider)
        }

        // Update the slider frame here

        if nil == percentLabel {
            percentLabel = UILabel(frame: CGRectZero)
            // Set other attributes here
            addSubview(percentLabel)
        }

        // Update the percent label frame here
    }

}