2016-12-13 3 views
0

(Swift3/iOS10)Положите две (бок о бок) кнопки в правой части наложения на UITextField

Я пытаюсь поставить две кнопки (сохранить/отменить) внутри 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. Что такое правая/idiomatic Способ для этого? Я чувствую, что я просто бросаю молотки здесь ...

+0

UIView и кнопки должны иметь свои переводыAutoresizingMaskIntoConstraints, установленные на false. Я бы экспериментировал и посмотрел, можно ли просто получить простой UIView с цветным фоном, чтобы показать (я, кажется, вспоминаю, что textField хочет, чтобы этот вид был квадратным и примерно 44x44, но не уверен). –

ответ

1

Создайте UIButton как тип .custom вместо системы.

И поскольку вы уже знаете высоту renameField в viewDidLoad, вам не нужно беспокоиться об ограничении.

Код ниже достаточно.

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; 
} 
+0

Работал как шарм. Я пытался догадаться. –

Смежные вопросы