将两个(并排)按钮放在UITextField

时间:2016-12-13 21:26:32

标签: ios swift uitextfield uikit overlay

(Swift3 / iOS10)

我正在尝试使用UITextField属性在rightView内放置两个按钮(保存/取消)。我的基本设置代码(从viewDidLoad调用)如下:

private func accesorizeRenameField() {
    let saveButton = UIButton(type: .system)
    saveButton.setImage(#imageLiteral(resourceName: "buttonCheckmark"), for: .normal)
    saveButton.addTarget(self, action: #selector(renameSave), for: .touchUpInside)
    saveButton.tintColor = UIColor(white: 0.15, alpha: 1)

    let cancelButton = UIButton(type: .system)
    cancelButton.setImage(#imageLiteral(resourceName: "buttonX"), for: .normal)
    cancelButton.addTarget(self, action: #selector(renameCancel), for: .touchUpInside)
    cancelButton.tintColor = UIColor(227, 34, 60, 1)

    let container = UIView()
    container.addSubview(saveButton)
    container.addSubview(cancelButton)
    container.translatesAutoresizingMaskIntoConstraints = false
    container.backgroundColor = UIColor.cyan

    saveButton.centerYAnchor.constraint(equalTo: container.centerYAnchor).isActive = true
    cancelButton.centerYAnchor.constraint(equalTo: container.centerYAnchor).isActive = true
    saveButton.heightAnchor.constraint(equalTo: container.heightAnchor).isActive = true
    cancelButton.heightAnchor.constraint(equalTo: container.heightAnchor).isActive = true
    saveButton.leadingAnchor.constraint(equalTo: container.leadingAnchor).isActive = true
    saveButton.trailingAnchor.constraint(equalTo: container.centerXAnchor).isActive = true
    cancelButton.leadingAnchor.constraint(equalTo: container.centerXAnchor).isActive = true
    cancelButton.trailingAnchor.constraint(equalTo: container.trailingAnchor).isActive = true

    self.renameField.rightView = container
    self.renameField.rightViewMode = .always
}

稍后,当我通过某个动画公开重命名字段时,我会调用

self.renameField.rightView?.bounds = CGRect(x: 0, y: 0, width: self.renameField.bounds.height * 2, height: self.renameField.bounds.height)
self.renameField.rightView?.setNeedsLayout()
"rightView.frame \(self.renameField.rightView?.frame)".print()
self.renameField.rightView?.subviews.enumerated().forEach() {index,child in
    "child \(index) frame \(child.frame)".print()
}

但是,我无法显示按钮。青色背景(用于调试)显示,但实际上是正方形(它应该是2:1矩形)。 print显示子视图的大小为0的帧。正确 / 惯用方式是什么?我觉得我只是在这里扔锤子......

1 个答案:

答案 0 :(得分:2)

将UIButton创建为.custom的类型,而不是.system。

正如您已经知道viewDidLoad中的renameField高度,您不需要为约束而烦恼。

以下代码就足够了。

override func
viewDidLoad() {
    super.viewDidLoad()

    let wSize = renameField.frame.size.height - 2

    let saveButton = UIButton( type: .custom )
    saveButton.setImage( #imageLiteral(resourceName: "buttonCheckmark"), for: .normal )
    saveButton.addTarget( self, action: #selector(renameSave), for: .touchUpInside )
    saveButton.frame = CGRect( x: 0, y: 0, width: wSize, height: wSize )

    let cancelButton = UIButton( type: .custom )
    cancelButton.setImage( #imageLiteral(resourceName: "buttonX"), for: .normal )
    cancelButton.addTarget( self, action: #selector(renameCancel), for: .touchUpInside )
    cancelButton.frame = CGRect( x: wSize, y: 0, width: wSize, height: wSize )

    let wV = UIView()
    wV.frame = CGRect( x:0, y:0, width: wSize * 2, height: wSize )
    wV.addSubview( saveButton )
    wV.addSubview( cancelButton )

    renameField.rightView = wV;
    renameField.rightViewMode = .always;
}