Поиск…


замечания

Когда вы создаете адаптивные приложения, имейте в виду ограничения классов размеров: они являются обобщениями , а не конкретными руководствами для точных размеров пикселей или устройств. Никогда не пытайтесь определить, на каком устройстве работает ваше приложение, или находится ли он в режиме разделения экрана на основе классов размеров.

Вместо этого сделайте решения высокого уровня макета для класса размера и используйте Auto Layout для изменения точных рамок. (См. Также метод viewWillTransition(to:with:) для более точного уведомления о том, насколько большой будет представление контроллера после перехода.)

Коллекции персонажей

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

Apple определяет два класса размера: обычный и компактный . Каждый из этих классов размеров доступен на обеих осях устройства (по горизонтали и по вертикали ). Ваше приложение может существовать в любом из этих четырех состояний на протяжении всей его жизни. В качестве сокращения разработчики часто описывают комбинацию классов размеров, говоря или записывая два класса размера, сначала с горизонтальной осью: «Compact / Regular» описывает интерфейс, который является горизонтально компактным, но вертикально регулярным.

В вашем приложении используйте методы в протоколе UITraitEnvironment, чтобы проверить свой текущий класс размеров и отреагировать на изменения:

class MyViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("Horizontal size class: \(traitCollection.horizontalSizeClass)")
        print("Vertical size class: \(traitCollection.verticalSizeClass)")
    }

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        print("Trait collection changed; size classes may be different.")
    }
}

Оба UIView и UIViewController соответствуют UITraitEnvironment, поэтому вы можете посмотреть свою текущую коллекцию признаков и обработать изменения в подклассах обоих.

Обновление автоматической компоновки с изменениями коллекции признаков

Создание адаптивного приложения, то есть реагирование на изменения класса размера путем изменения макета - часто требует большой помощи от системы автоматического макета. Одним из основных способов адаптации приложений является обновление активных ограничений автоматического макета при изменении класса размера представления.

Например, рассмотрите приложение, которое использует UIStackView для организации двух UILabels. Мы можем захотеть, чтобы эти ярлыки складывались друг на друга в горизонтально компактных средах, но сидели рядом друг с другом, когда у нас было немного больше места в горизонтально-обычных средах.

class ViewController: UIViewController {
    var stackView: UIStackView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        stackView = UIStackView()
        for text in ["foo", "bar"] {
            let label = UILabel()
            label.translatesAutoresizingMaskIntoConstraints = false
            label.text = text
            stackView.addArrangedSubview(label)
        }
        
        view.addSubview(stackView)
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        updateAxis(forTraitCollection: traitCollection)
    }
    
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        updateAxis(forTraitCollection: traitCollection)
    }
    
    private func updateAxis(forTraitCollection traitCollection: UITraitCollection) {
        switch traitCollection.horizontalSizeClass {
        case .regular:
            stackView.axis = .horizontal
        case .compact:
            stackView.axis = .vertical
        case .unspecified:
            print("Unspecified size class!")
            stackView.axis = .horizontal
        }
    }
}

Поддержка многозадачности iOS на iPad

Ключевым элементом адаптивности в современном приложении iOS является поддержка многозадачности на iPad. По умолчанию приложения, созданные в Xcode 7 и новее, будут настроены на поддержку многозадачности: у них будет файл LaunchScreen.storyboard, который использует автоматический макет.

Самый простой способ для существующих приложений выбрать многозадачность - создать такую ​​раскадровку, а затем установить ее как экран запуска проекта:

Добавление раскадровки экрана запуска

Настройка параметра «Файл экрана запуска»

После того, как ваше приложение поддерживает многозадачность iPad, проверяйте существующие представления и контроллеры представления, чтобы убедиться, что они используют автоматический макет и могут поддерживать различные комбинации классов размеров.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow