Многозадачность iPad на iOS 9

Многозадачность iPad на iOS 9

Многозадачность - это новая функция на iOS 9, и я могу гарантировать, что она всем придется по душе. Сейчас самое время, чтобы начать модернизацию приложений, иначе ваши пользователи начнут жаловаться, что не могут работать в многозадачном режиме с вашим приложением!

Вы будете рады узнать, что поддержка многозадачности проста. На самом деле, это так просто, что наше нынешнее приложение уже поддерживает его. Не верите мне? Попробуйте прямо сейчас: запустите ваше приложение, поверните симулятор в горизонтальную позицию (Cmd + левая или правая клавиша курсора), затем перетащите с правого края экрана.

Первый раз, когда вы сделаете это, то увидите список различных приложений на выбор. Пожалуйста, выберите «Календарь» для текущего времени. Когда вы сделаете это, IOS активирует Slide Over, а это значит, что ваше приложение все еще располагается на полном экране, но он потускнеет, в тот момент, когда приложение «Календарь»  сфокусируется на правой части экрана. По левому краю «Календаря» вы увидите тонкую белую линию, которая является разделителем — перетащите ее немного левее, и вы увидите все изменения интерфейса, как IOS переходит от Slide Over к Split View.

Я попросил вас изменить симулятор на ландшафтный режим потому, что Split View на самом деле имеет две точки привязки. Первая располагает ваше приложение на 2/3 экрана слева и «Календарь» занимает оставшуюся часть справа. Второй вы можете достигнуть, перетащив разделитель в центре экрана, тогда оба приложения займут по половине экрана. Если вы находитесь в портретном формате, то у вас будет только один режим и составляет он около 60/40.

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

  1. Используйте XIB - она позволяет iPhone 6 поддерживать iOS 8 и скорее всего у вас он уже имеется. Если же нет, то добавьте новый файл и выберите «User Interface», а затем «Launch Screen». После, в «plist» добавьте ключ для запуска «Launch screen interface file base name», что переводится как: "Загрузить базовое имя файла интерфейса экрана», и укажите его имя вашей XIB, без расширения «.xib». Например, если ваш экран запуска называется «LaunchScreen.xib», необходимо дать этой ключевой значение «LaunchScreen».
  2. Убедитесь что ваше приложение настраивается для поддержки всех ориентаций - горизонтального и вертикального вида. Оно может быть уже настроено именно таким образом, но если вы не уверены в этом, то лучше убедитесь, что сейчас вы выбираете обе ориентации. Только представьте какой хаос начнется в многозадачности, если избирательно выбирать только определенную ориентацию!
  3. Используйте «Auto Layout» везде. Если ваше приложение было установлено до «Auto Layout» или, если вам сначала показалось это устрашающим, то скорее всего вы до сих пор боретесь с автоматическим изменением масок. Сейчас настало время, чтобы это изменить: различные размеры многозадачности не требуют от «Auto Layout» большого ума.
  4. Используйте адаптивный интерфейс, где это необходимо. Адаптивная компоновка («Adaptive layout») термин Apple для технологий, таких как «size class» и динамический тип, первый из которых является огромным преимуществом при работе с многозадачностью. «Size Classes» позволяют настроить ваш интерфейс на два основных размера экрана - компактного и обычного, которые ранее использовались для работы с iPhone и iPad, но в настоящее время также используются для многозадачности.

Даже если конкретный проект работает с многозадачностью по умолчанию, то он в любом случае не имеет встроенного адаптивного интерфейса пользователя. В результате, если мы будем использовать многозадачность по-другому - то есть, если наше приложение одно занимает 1/3 части экрана, в то время как некоторые другие приложения занимают оставшееся место - то это будет выглядеть ужасно: наши вертикально расположенные веб изображения («views») в конечном итоге станут настолько тонкими, что будут непригодны.

Решение простое: мы собираемся рассказать вам как организовать свои веб изображения («views») горизонтально, тогда у нас будет много пространства в этом положении, а по вертикали гораздо меньше. Это делается с помощью метода traitCollectionDidChange() , который вызывается автоматически, когда «size class» нашего приложения меняется. Мы можем запросить «size class», который теперь есть у нас, и адаптировать наш пользовательский интерфейс.

Существует одна сложность, и заключается она в понимании «size class». Есть две оси для классов размеров, а именно горизонтальная ось и вертикальная. И каждая из них имеет два размера: компактный и регулярный(обычный). Независимо от того, какую ориентацию или многозадачность мы устанавливаем, вертикальный «size class» всегда является обычным на iPad. Для других возможностей существуют следующие основные правила:

  1. iPad приложение работает само в портретном или ландшафтном режиме и имеет основной(регулярный) горизонтальный «size class»;
  2. в ландшафтном режиме, где приложения разделены 50/50, оба работают в компактном горизонтальном «size class»;
  3. в ландшафтном режиме, где приложения разделены 70/30, приложение слева имеет регулярный горизонтальный «size class», а приложение справа имеет компактный в портретном режиме, где приложения делятся 60/40 и оба работают в компактном горизонтальном «size class»;

Мы собираемся использовать эту информацию, чтобы определить, когда «size class» изменился и усовершенствовать наш «stack view» должным образом. Когда у нас есть регулярный горизонтальный «size class», мы будем использовать горизонтальное расположение («stacking»), и когда у нас компактный «size class», мы будем использовать вертикальное расположение. Вот код:

override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
    if self.traitCollection.horizontalSizeClass == .Compact {
        stackView.axis = .Vertical
    } else {
        stackView.axis = .Horizontal
    }
}

На этом этапе мы технически можем закончить проект, но мы собираемся сделать еще две простые вещи, чтобы отполировать его. Во-первых, мы собираемся создать метод, который будет обновлять панель навигации и показывать заголовок страницы из активного веб-просмотра при его изменении. Это позволит использовать метод stringByEvaluatingJavaScriptFromString() для выполнения document.title и вытаскивания заголовка страницы. Это сравнимо со свойством WKWebView's title в некоторой мере, но недостаточно стабильно в этой ранней бета-версии!

func updateUIUsingWebView(webView: UIWebView) {
    title = webView.stringByEvaluatingJavaScriptFromString("document.title")
    addressBar.text = webView.request?.URL?.absoluteString ?? ""
}

Во-вторых, мы должны вызвать этот метод в двух необходимых местах: всякий раз, когда мы выбираем «Web View», и всякий раз, когда «Web View» меняет страницу. Для первого нам нужно добавить строчку перед концом selectWebView():

updateUIUsingWebView(webView)

В последнем случае — это реализация метода webViewDidFinishLoad (), который мы можем получить, так как настроили наш «view» контроллер быть делегатом каждого из «web views». Итак, поставьте где-то код в «ViewController.swift»:

func webViewDidFinishLoad(webView: UIWebView) {
    if webView == activeWebView {
        updateUIUsingWebView(webView)
    }
}

Как вы можете видеть, мы только что обновили пользовательский интерфейс, чтобы отображать название страницы в том случае, если оно происходит от «active web view», иначе, была бы путаница. Вот так - проект готов!

Источник: www.hackingwithswift.com/read/31/5/ipad-multitasking-in-ios-9​