Вложение представлений друг в друга
Представления могут создаваться и добавляться в представления, которые
сами находятся внутри других представлений, которые, в свою очередь, на
-
ходятся в третьих представлениях, и т. д. – до самого верхнего
UIView
! Давай
-
те создадим представление и добавим его как дочерний компонент в другое
представление.
Следующий код создает родительское и дочернее представления, а затем
вызывает
addSubview(_:)
, чтобы добавить дочернее представление в массив
вложенных в родителе:
let parentView = UIView(frame: .zero)
let childView = UIView(frame: .zero)
parentView.addSubview(childView)
Многопоточное окружение
Используете разные потоки выполнения? Будьте осторожны! Операции с представления
ми должны выполняться только в основном потоке. Для выполнения действий с пред
-
ставлениями в асинхронных операциях лучше всего использовать Grand Central Dispatch
(GCD)
:
DispatchQueue.main.async {
// Здесь выполняются действия с представлениями
}
Более подробную информацию по этой теме вы найдете в главе 8.
Мы добавили представление, а теперь удалим его! Опираясь на пример
выше, вот как можно заставить дочернее представление удалить себя из ро
-
дителя:
childView.removeFromSuperview()
54
Представления
Ограничения
Рано или поздно у вас неизбежно появится необходимость организовать ав
-
томатическое изменение размера представления. Обычно для этих целей ис
-
пользуется набор ограничений, определяющих размеры относительно другого
представления. Допустим, у нас есть кнопка – особый вид представления, спо
-
собный принимать события, – и нам нужно поместить в 100pt ниже верхнего
края экрана и растянуть по ширине так, чтобы левый и правый края кнопки
находились в 16pt от соответствующего края экрана. Реализовать это в коде
можно с помощью ограничений, например:
class ExampleViewController: UIViewController {
// Настраивает кнопку после загрузки представления
override func viewDidLoad() {
super.viewDidLoad()
setupButton()
}
// Это фактический метод настройки кнопки
func setupButton() {
// Создать кнопку
let button = UIButton(frame: .zero)
button.translatesAutoresizingMaskIntoConstraints = false
// Определить цвет фона кнопки
button.backgroundColor = .blue
// Добавить кнопку в родительское представление
view.addSubview(button)
// Задать расстояние до верхнего края представления
button.topAnchor.constraint(equalTo: view.topAnchor, constant: 100.0)
.isActive = true
// Задать расстояние до левого края представления
button.leadingAnchor
.constraint(equalTo: view.leadingAnchor, constant: 16.0)
.isActive = true
// Задать расстояние до правого края представления
button.trailingAnchor
.constraint(equalTo: view.trailingAnchor, constant: -16.0)
.isActive = true
}
}
Рассмотрим поближе происходящее здесь. Во-первых, мы определили класс
ExampleViewController
контроллера представления для кнопки; это подкласс
UIV
iewController
, и, как всякий контроллер представления, он хранит ссылку на
свое представление в свойстве
view
. Мы добавили в класс метод
setupButton()
,
который вызывается после загрузки представления. Внутри
setupButton()
мы
создаем экземпляр кнопки с пустым кадром и присваиваем ее свойству
trans
latesAutoresizingMaskIntoConstraints
значение
false
.
Глядя на установленные ограничения, можно заметить, что мы ссылаемся
на верхний якорь (то есть на верхний край) кнопки и размещаем его в 100pt
iOS
55
от верхнего якоря родительского представления. То же самое мы проделываем
с передним (
leadingAnchor
) и задним (
trailingAnchor
) якорями, но устанавливаем
расстояние, равное
16.0
.
Если запустить этот код, появится представление, как показано на рис. 2.1.
Do'stlaringiz bilan baham: |