Кто должен управлять Элементами пользовательского интерфейса, представлением или контроллером?

В настоящее время я разрабатываю приложение iOS, и мне было интересно, как управлять элементами пользовательского интерфейса. Я использую раскадровку для размещения своих просмотров и автозапуска, чтобы сделать все разрешение независимым. Если это поможет, вот немного информации о том, как я столкнулся с этим вопросом.

Некоторые Backgroud

Расположение кнопок

У меня есть кнопки, представляющие клавиши пианино, и я позже в коде добавляю subview к этим, которые рисуют на них фактические ключи. Я сделал это, создав @IBOutlets на ViewController и предположив UIDeviceOrientationDidChangeNotification . Это называется методом, который добавляет subviews на основе текущих кнопок, чтобы получить ключи соответствующего размера.

Это отлично работает при работе в iOS 8.1, но если я запустил приложение на iOS 7 , рамки кнопок не были обновлены до новой ориентации к моменту, когда я получил UIDeviceOrientationDidChangeNotification , поэтому все было испорчено в ландшафте. Я сделал небольшое исследование ( UIInterfaceOrientation еще не обновлена, когда UIDeviceOrientationDidChangeNotification попала в UIView ), и кажется, что хорошим решением было бы переопределить метод layoutSubviews . Проблема в том, что layoutSubviews – это метод UIView, и я управляю своими кнопками и пользовательским интерфейсом в своем UIViewController.

Импульсивно я хотел подклассифицировать UIView, переопределить layoutSubviews и оттуда вызвать метод на моем контроллере, чтобы правильно добавить ключи к кнопкам, но это звучит не так.

Вопросы

Мой пользовательский интерфейс управляется UIViewController. Но мне нужно обновить мои взгляды на основе самого метода UIView. Я полагаю, уважать принципы MVC, что мой взгляд не должен теперь касаться моего контроллера, но затем возникает несколько вопросов:

  • Кто должен управлять пользовательским интерфейсом?
  • Является ли моя стратегия неправильной, и должен ли UIView удерживать кнопки @IBOutlets на кнопках, чтобы впоследствии можно было применять подзаголовки, которые мне нужны для них?
  • Если вы читаете фон, у вас есть предложение для этой конкретной ситуации?

Я предполагаю, что сложность этой проблемы относительно невелика, и мне не нужно настраивать уведомления в NSNotificationCenter, но я могу ошибаться. Мне бы очень хотелось услышать, что это не единственное решение.

Заранее спасибо. Надеюсь, я был достаточно ясен, но если вы хотите / нуждаетесь в каких-либо дополнительных подробностях о моей конкретной ситуации, сообщите мне, и я с удовольствием расскажу.

если я правильно понял вопрос, ваш ViewController должен выкладывать ключи в его представлении. Хорошее, но не единственное, место для этого – это viewDidLayoutSubviews метод которого вы можете переопределить на UIViewController.

Теперь, если ваши взгляды должны поддерживать их внутреннюю компоновку. т.е. если у кнопок / клавиш есть какие-либо подзаголовки, вы должны обновить их в layoutSubviews на UIView, как вы упомянули.

Оба метода будут вызваны в ответ на изменения границ или центра вашего родительского представления.

Что касается изменений вращения, то в iOS 8 вы должны использовать viewWillTransitionToSize:withTransitionCoordinator: или willTransitionToTraitCollection:withTransitionCoordinator: зависимости от ваших потребностей.

Я настоятельно рекомендую вам написать ваш макет независимо от ориентации. Вы должны просто использовать ограничивающие рамки представления для ссылки и никогда не жесткого кода в любых фреймах. Например, возможно, один из ваших ключей должен быть 1/56 ширины его супервизора вместо магического числа для портретной и альбомной ориентации.

  • Плавное масштабирование векторной графики в UIView
  • ios 7 UIView animateWithDuration: .. запускается немедленно
  • Как отлаживать большое распределение памяти UIView
  • UITableView на UIView с UITapGestureRecognizer (выбор ячейки не работает)
  • Использовать UIView в качестве фона UIButton?
  • Взаимодействие с пользователем вне границ UIView
  • @IBDesignable ошибка рендеринга в построителе интерфейса
  • Цвет фона UIView при рисовании
  • Переход UIViewFromView не анимируется в контейнере
  • iOS: начало UIView в отношении UIWindow
  • Анимация UIView в viewDidLoad / viewDidAppear?
  • Давайте будем гением компьютера.