UIStackViewPlayground | Кодементор

UIStackView появился в iOS 9. И с самого начала он мне понравился. UIStackViews позволяют использовать Auto Layout без добавления ограничений Auto Layout. И в большинстве случаев вам удается изменить несколько свойств, чтобы добиться того, чего вы хотите. Однако вам нужно некоторое время, чтобы привыкнуть к этому. Итак, когда была доступна бета-версия iOS 9, я создал Игровая площадка Xcode поэкспериментировать с новыми блестящими UIStackViews.

Сначала я сделал несколько простых макетов, таких как калькулятор и простую ленту Twitter. Но позже я попытался воссоздать внешний вид трамплина с помощью UIStackViews. Вот результат:

01.png

Каждое приложение (значок вместе с заголовком) представляет собой одно представление стека.

let appStackView = { (imageName: String, title: String) -> UIStackView in 

  let imageView = UIImageView(image: UIImage(named: imageName))      
  imageView.widthAnchor.constraint(equalToConstant: 60).isActive = true 
  imageView.heightAnchor.constraint(equalToConstant: 60).isActive = true
  
  let subviews = [imageView, labelWithText(title)] 
  let stackView = UIStackView(arrangedSubviews: subviews) 
  stackView.axis = .vertical 
  stackView.distribution = .equalSpacing 
  stackView.spacing = 3 
  return stackView
} 

let calendarStackView = appStackView("calendar", "Calendar")
let photosStackView = appStackView("photos", "Photos")
let mapsStackView = appStackView("maps", "Maps")
let remindersStackView = appStackView("notes", "Reminders")
let healthStackView = appStackView("health", "Health")
let settingsStackView = appStackView("settings", "Settings")
let safariStackView = appStackView("safari", "Safari")

Календарь и приложение «Здоровье» вместе представляют собой стек, а также фотографии и настройки.

let columnStackView = { (views: [UIView]) -> UIStackView in 
  let stackView = UIStackView(arrangedSubviews: views) 
  stackView.axis = .vertical 
  stackView.spacing = 10 
  stackView.distribution = .fillEqually 
  return stackView
} 

let firstColumnStackView = columnStackView([calendarStackView, healthStackView])
let secondColumnStackView = columnStackView([photosStackView, settingsStackView])

Первые два столбца с приложениями и два других приложения помещаются в другое представление стека:

let appsStackView = UIStackView(arrangedSubviews: [firstColumnStackView, secondColumnStackView, mapsStackView, remindersStackView])
appsStackView.distribution = .fillEqually
appsStackView.alignment = .top
appsStackView.spacing = 15

Safari находится в виде стека, и вместе с элементом управления страницей он помещается в другое представление стека. Представление стека с приложениями помещается в другое представление стека вместе с меткой времени:

let topStackView = UIStackView(arrangedSubviews: [timeLabel, appsStackView])
topStackView.axis = .vertical
topStackView.spacing = 5

А затем верхнее представление стека помещается в другое представление стека вместе с информационной меткой и представлением стека внизу с Safari и элементом управления страницей. И это последнее представление стека добавляется к представлению в качестве подпредставления и упорядочивается с использованием обычных ограничений автоматического макета.

let mainStackView = UIStackView(arrangedSubviews: [topStackView, infoLabel, safariColumnStackView])
mainStackView.translatesAutoresizingMaskIntoConstraints = false
mainStackView.axis = .vertical
mainStackView.distribution = .equalSpacing
mainStackView.alignment = .center 

hostView.addSubview(dockBackgroundView)
hostView.addSubview(mainStackView) 
NSLayoutConstraint.activate( 
  [
    mainStackView.leadingAnchor.constraint(equalTo: hostView.leadingAnchor), 
    mainStackView.trailingAnchor.constraint(equalTo: hostView.trailingAnchor), 
    mainStackView.topAnchor.constraint(equalTo: hostView.topAnchor, constant: 3), 
    mainStackView.bottomAnchor.constraint(equalTo: hostView.bottomAnchor, constant: -3), 
    dockBackgroundView.leadingAnchor.constraint(equalTo: hostView.leadingAnchor), 
    dockBackgroundView.trailingAnchor.constraint(equalTo: hostView.trailingAnchor), 
    dockBackgroundView.bottomAnchor.constraint(equalTo: hostView.bottomAnchor), 
    dockBackgroundView.heightAnchor.constraint(equalToConstant: 95),
  ]
)

Как вы можете видеть в этом посте, представления стека становятся очень мощными, когда вы их вкладываете. Итак, складывайте все вещи!

Следуй за мной на Твиттер и просмотрите другие мои материалы с открытым исходным кодом на Гитхаб.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *