Ограничения iOS не позволяют использовать множитель

Я пытаюсь создать некоторые пользовательские представления, и когда я пытаюсь активировать ограничения, Xcode говорит, что я не могу использовать множитель. Вот пример кода:

class MenuView: UIView {

    var addButton: AddButton!
    var settingsButton: SettingsButton!

    // ........

    func setConstraints (withBarReference reference: NSLayoutYAxisAnchor) {
        NSLayoutConstraints.activateConstraints([
             // ........
             addButton.centerXAnchor.constraintEqualToAnchor(self.centerXAnchor, multiplier: 0.5),
             // ........
             settingsButton.centerXAnchor.constraintEqualToAnchor(self.centerXAnchor, multiplier: 1.5)
        ])
    }

}

Дело в том, что Xcode выдает синтаксическую ошибку на contraintEqualToAnchor: functions и говорит, что я должен заменить "множитель" на "константа".

Почему я не могу использовать опцию умножения с центральными якорями X?

4 ответа

Вы не можете установить множитель с помощью вспомогательных функций, но вы можете установить множитель с помощью инициализатора NSLayoutConstraint. Просто сам застрял, но нашел ответ.

Ваш код: addButton.centerXAnchor.constraintEqualToAnchor(self.centerXAnchor, multiplier: 0.5)

Правильный код: NSLayoutConstraint(item: addButton, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 0.5, constant: 0)

Кроме того, не забудьте активировать это ограничение, набрав isActive = true

Предыдущие ответы сейчас работают очень странно.

Вы можете просто создать UILayoutGuid с множителем ширины / высоты с представлением и установить guid.trailing равным centerX вашего подпредставления.

Например, если вам нужно разместить addButton в первой 1/3 представления, а settingsButton в 2/3, вы можете просто установить две направляющие макета

let addButtonGuid = UILayoutGuide()
self.addLayoutGuide(guid)
addButtonGuid.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 1/3).isActive = true
addButtonGuid.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
addButton.centerXAnchor.constraint(equalTo: addButtonGuid.trailingAnchor).isActive = true
// same for settingsButton

Но лучший способ - использовать UIStackView и установить его distribution собственность equalCentering

Кажется, что в IB вы можете использовать опцию умножения с Center X и получить эффект, который вы ищете (установите центр button1 равным 1/4 ширины вида, в котором он находится, и центр button2 равным 2/3 ширины вида, в котором он находится):
установка центра кнопки на 1/4 ширины вида, в котором она находится, с помощью Interface Builder, установка центра кнопки на 2/3 ширины вида, в котором она находится, в StoryBoard

Я пытался использовать его как в коде, так и в IB, и в коде я получил ту же ошибку, что и вы. Удивительно, но в IB это сработало, ни ошибок, ни предупреждений. (Я использую Xcode 7, попробую его в Xcode 8, чтобы посмотреть, работает ли он по-прежнему).

Вы не можете использовать множители на NSLayoutXAxisAnchor якоря - умножение на позицию вдоль линии не имеет смысла в понимании системы ограничений. Вы можете использовать только множители с NSLayoutDimension якоря, которые измеряют длину, как ширина.

Макет, который вы пытаетесь создать, будет лучше реализован с использованием стека.

Это имеет тот же результат:

//old settingsButton.centerXAnchor.constraintEqualToAnchor(self.centerXAnchor, multiplier: 1.5)
//working settingsButton.centerXAnchor.constraintEqualToAnchor(self.centerXAnchor, constant: self.frame.width / 2 * 0.5)
Другие вопросы по тегам