Как сделать программно добавленный размер представления к его родительскому виду?

Я работаю над пользовательской клавиатурой с собственным представлением, которое я редактирую в Interface Builder.

Представление программно добавляется к корневому представлению клавиатуры при загрузке. Он содержит представления стека и автоматически заполняет все представление.

Проблема заключается в том, что вид клавиатуры не соответствует размеру представления приложения, в котором оно открывается. Кажется, что он имеет некоторый фиксированный размер, потому что, когда я поворачиваю симулятор по горизонтали, я вижу больше по ширине и меньше по вертикали.

Как мне сделать его размер равным ширине корневого представления, в котором он находится?

Вот как клавиатура выглядит в конструкторе интерфейсов и в симуляторе под управлением iPhone 5S:

размеры


person Sergei Basharov    schedule 26.09.2016    source источник
comment
Пожалуйста, добавьте скриншот, чтобы показать, как это выглядит прямо сейчас.   -  person Bista    schedule 26.09.2016


Ответы (2)


Во-первых, нам нужно получить доступ к изменениям размера из-за изменений макета, мы могли бы сделать это так:

override var bounds: CGRect {
    didSet {
      print("Bounds have changed: \(bounds)")
    }
}

Это должно использоваться в вашем пользовательском представлении клавиатуры. Далее мы хотим обновить пользовательскую раскладку клавиатуры. Глядя на ваши скриншоты, можно предположить, что все, что нам нужно сделать, это отрегулировать высоту и ширину клавиш, позже вы можете добавить корректировки из-за изменения класса размера, что даст больше контроля над макетом. Вам нужно будет сохранить ссылку на ограничение высоты и ширины, используя @IBOutlets или перебирая ваши подпредставления и вручную находя и изменяя ограничения ширины и высоты, и то, и другое может быть утомительным, но использование @IBOutlets проще.

func updateKeys() {
    DispatchQueue.main.async {
        // Create array of width constraints
        let widthConstraints: [NSLayoutConstraint] = widthArray() 
        widthConstraints.forEach { _ in /* change width constant for current layout */ }

        // Create array of height constraints
        let heightConstraints: [NSLayoutConstraint] = heightArray() 
        heightConstraints.forEach { _ in /* change height constant for current layout */ }

    }
}

Это всего лишь один из способов сделать это, я считаю, что с автоматической компоновкой всегда есть один-единственный способ сделать это со сложными макетами, но он должен показать вам шаблон, который вы можете использовать.

person Peter Hornsby    schedule 04.11.2016

Вы пытались реализовать эти уведомления?

[[NSNotificationCenter defaultCenter] addObserver:self
                                       selector:@selector(keyboardFrameWillChange:)
                                           name:UIKeyboardWillShowNotification
                                         object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                       selector:@selector(keyboardFrameWillChange:)
                                           name:UIKeyboardWillChangeFrameNotification
                                         object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:)
                                           name:UIKeyboardWillHideNotification
                                         object:nil];

Затем, когда эти уведомления вызываются, измените размер вашего представления на рамку клавиатуры.

CGRect keyboardFrame;
[[notification.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame];

CGRect viewFrame = keyboardFrame;
person Shayan Jalil    schedule 26.09.2016
comment
Этот вопрос помечен как Swift, а не как Objective-C. - person Eric Aya; 26.09.2016