почему UIWindow является дочерним и родительским по отношению к UView?
-
06-07-2019 - |
Вопрос
В справочнике UIKit говорится, что UIView является суперклассом UIWindow, но, несмотря на это происхождение, UIWindow фактически управляет UIViews.Для меня это звучит так необычно.
Кто-нибудь знает, как это важно с точки зрения разработки программного обеспечения?
Большое спасибо.
РЕДАКТИРОВАТЬ:
Я прочитал соответствующий параграф в руководстве по программированию iPhone.Но я не мог понять, почему они делают обратное:пусть UIWindow будет родительским элементом UIView.Должно быть, что-то заставило Apple спроектировать иерархию классов таким образом.
Решение
Одна вещь, которая может показаться необычной опытным разработчикам Mac OS X в классе UIWindow, — это его наследование.В Mac OS X родительским классом NSWindow является NSResponder.В ОС iPhone родительским классом UIWindow является UIView.Таким образом, в iPhone OS окно также является объектом просмотра.Несмотря на свое происхождение, вы обычно относитесь к окнам в iPhone OS так же, как и в Mac OS X.То есть вы обычно не манипулируете свойствами объекта UIWindow, связанными с представлением, напрямую.
РЕДАКТИРОВАТЬ:
UIView — это нечто общее (предоставляет общие методы, которые вы используете для создания всех типов представлений и доступа к их свойствам.), тогда как UIWindow более конкретен (класс определяет объекты, которые управляют и координируют окна, которые приложение отображает на экране).
Я знаю, что это немного расплывчато, и я думаю, что только Apple знает точную причину такой иерархии.
Класс UIWindow определяет объекты (известные как windows), которые управляют и координируют окна, отображаемые приложением на экране.Двумя основными функциями окна являются предоставление области для отображения его представлений и распределение событий по представлениям.
Класс UIView предоставляет общие методы, которые вы используете для создания всех типов представлений и доступа к их свойствам.Например, если у подкласса нет собственного назначенного инициализатора, вы используете initWithFrame:метод создания представления.Свойство кадра определяет начало координат и размер представления в координатах суперпредставления.Начало системы координат для всех видов находится в верхнем левом углу.
Объекты UIView располагаются внутри объекта UIWindow во вложенной иерархии подпредставлений.Родительские объекты в иерархии представлений называются суперпредставлениями, а дочерние — подпредставлениями.Объект представления претендует на прямоугольную область окружающего его суперпредставления, отвечает за всю отрисовку внутри этой области, а также имеет право получать события, происходящие в нем.Одноуровневые представления могут без проблем перекрываться, что позволяет размещать сложные представления.
Другие советы
Потому что тогда каждый UIView будет иметь (унаследованные) свойства и поведение, которые имеют смысл только для окон.Это просто неправильно.
Обратное имеет больше смысла:окно добавляет поведение поверх представлений.Таким образом, он может рисовать, иметь границы, содержать другие представления и т. д.Но он расширяет это, например, зная, как выполнять рендеринг на дисплее.
В MacOS X NSWindows не являются представлениями.Они содержат «корневое представление», называемое contentView.Окна iOS представляют собой композицию NSWindow + его корневое представление.
Каждый обычный UIView, включая корневое представление главного окна, должен иметь родительское представление.UIWindow наследует UIView для выполнения обязанностей родительского представления в иерархии представлений.UIWindow не является обычным представлением и имеет собственные реализации методов из интерфейса UIView.