Неправильный макет в конце awakeFromNib — требуется изменить размер, чтобы исправить его

#objective-c #cocoa

#objective-c #какао

Вопрос:

У меня есть функция awakeFormNib, которая добавляет некоторые подвиды. Он не использует автоматическую компоновку. Обычно это выглядит идеально. На некоторых машинах он отображается с одним из вложенных представлений слишком маленьким. Как только я изменяю размер окна (с помощью мыши), все становится идеально. Кажется, что операция компоновки seme выполняется до awakeFromNib на этих машинах (по предположению). Я нашел очень неэлегантный обходной путь, когда в конце awakeFromNib я вызываю setFrame в одном из подвидов, чтобы изменить его размер на один пиксель. Это должно иметь тот же эффект, что и изменение размера с помощью мыши, поскольку это приводит к отображению макета так, как ожидалось.

Итак, мой вопрос заключается в следующем: есть ли функция, которую я могу вызвать в окне или его подпросмотрах, которая вызывает те же операции компоновки, которые были бы вызваны изменением размера (с помощью мыши) или изменением размера фрейма в коде. я попытался вызвать setNeedsLayout и setNeedsDisplay: но безуспешно.

Ответ №1:

Вам необходимо реорганизовать весь ваш код фрейминга с awakeFromNib на:

 - (void)layoutSubviews {
  [super layoutSubviews];

}
  

Почему?

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