Статьи

iOS 9: введение в многозадачность на iPad

С iOS 9 Apple представила ряд возможностей многозадачности для iPad. К ним относятся « Скольжение» , « Разделение» и « Картинка в картинке» . Если вы не знакомы с этими новыми функциями, вот краткий обзор.

Slide Over доступен на iPad Mini 2 и более поздних версиях, на всех моделях iPad Air и iPad Pro. Это позволяет приложениям скользить с правой стороны экрана при полной высоте экрана (в обоих направлениях) и приблизительной ширине экрана iPhone.

Скользить по

Картинка в картинке доступна на всех моделях iPad, которые поддерживают функцию Slide Over. Это позволяет продолжать воспроизведение видео в небольшом представлении, пока вы работаете с другими приложениями на iPad. Этот небольшой вид содержит три кнопки для управления воспроизведением, возврата в полноэкранный режим, воспроизведения / паузы и закрытия. Вид можно изменить или временно отодвинуть в сторону экрана.

Картинка в картинке видео

Split View доступен для iPad Mini 4, iPad Air 2 и iPad Pro. Это позволяет iPad одновременно запускать два полнофункциональных приложения. Пользователь может перемещать разделитель между двумя приложениями, чтобы изменить их размер.

Обратите внимание, что приложение слева называется основным приложением, а приложение справа — вторичным. приложение. Основное приложение владеет строкой состояния устройства и всегда занимает как минимум половину экрана. Основное приложение может быть отклонено пользователем, однако, если они переместят разделитель полностью влево.

Разделенный вид

Это руководство требует, чтобы вы работали с Xcode 7 или новее на OS X Yosemite или новее. Это также предполагает, что вы узнали о классах размера и Auto Layout . Если вы новичок в адаптивном дизайне, то я рекомендую прочитать урок Джордана Моргана по адаптивному дизайну . Вам также необходимо скачать стартовый проект с GitHub .

По умолчанию все приложения, созданные из любого шаблона XCode 7, автоматически поддерживают режимы слайд-шоу и разделения. Это связано с тем, что ваше приложение создается с файлом LaunchScreen.storyboard и включенным классом размера файла Main.storyboard .

Для проектов, которые были созданы с более ранней версией Xcode, вы можете включить Slide Over и Split View для вашего приложения, выполнив следующие два шага.

Создайте файл LaunchScreen.storyboard , выбрав iOS> Интерфейс пользователя> Шаблон экрана запуска . Экран запуска отобразится, как только ваше приложение будет запущено с главного экрана и пока оно все еще загружается.

Раскадровка экрана запуска

Обратите внимание, что эта раскадровка заменяет статические образы запуска, которые вы уже настроили для своего приложения.

Убедитесь, что ваш пользовательский интерфейс использует классы размеров и Auto Layout . Вы можете убедиться в этом, выбрав раскадровку вашего проекта, открыв инспектор файлов и отметив флажок « Использовать автоматическую компоновку» и Установите флажки « Классы размера» в разделе « Документ Интерфейсного Разработчика ».

Конфигурация раскадровки

Обратите внимание, что вам нужно сделать это для каждой раскадровки в вашем проекте. Теперь, когда вы знаете, как правильно настроить приложение для Slide Over и Split View, пришло время узнать, как обеспечить, чтобы ваше приложение работало хорошо вместе с другими приложениями.

Для Slide Over текущий класс размера вашего приложения при запуске всегда будет одинаковым. Когда ваше приложение является основным приложением, оно будет иметь доступ к полноэкранному режиму (класс обычной ширины и высоты), и ничто не будет отличаться. Когда ваше приложение открывается с помощью функции «Скольжение», оно будет иметь компактную ширину и класс размера обычной высоты независимо от ориентации.

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

Диаграмма классов размеров
Источник : Apple, «Внедрение улучшений многозадачности на iPad»: краткое руководство пользователя.

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

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

iPad Pro горизонтальный размер класса
Снимок экрана, полученный из завершенного учебного приложения

Чтобы учесть эти изменения в размере, класс UIViewController соответствует двум протоколам, UITraitEnvironment и UIContentContainer .

Этот протокол содержит свойство UITraitCollection называемое traitCollection и метод для изменения этой коллекции признаков traitCollectionDidChange(_:) . Этот объект коллекции признаков позволяет вам узнать конкретные сведения о рабочем состоянии вашего приложения, такие как масштаб отображения, текущие классы размеров по горизонтали и вертикали, возможность 3D-касания (называемая API-интерфейс Force Touch) и текущий тип устройства. (iPhone / iPod Touch, iPad, Apple TV или не указано ).

Этот протокол содержит свойство lovelyContentSize, а также многочисленные методы для изменения размера или набора признаков для текущего контейнера. Мы подробнее рассмотрим два метода, определенных протоколом UIContentContainer .

Откройте стартовый проект, который вы загрузили с GitHub, и перейдите к ViewController.swift . Затем добавьте следующие методы в определение класса:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
     
    self.viewWidth.text = «\(size.width)pts wide»
}
 
override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator: coordinator)
     
    switch newCollection.horizontalSizeClass {
    case .Compact:
        self.sizeClass.text = «Compact Horizontal Size Class»
    case .Regular:
        self.sizeClass.text = «Regular Horizontal Size Class»
    case .Unspecified:
        self.sizeClass.text = «Unspecified Horizontal Size Class»
    }
}

В viewWillTransitionToSize(_:withTransitionCoordinator:) мы обновляем метку viewWidth для отображения новой ширины экрана.

В willTransitionToTraitCollection(_:withTransitionCoordinator:) мы проверяем, к какому классу горизонтального размера выполняется переход, и соответствующим образом sizeClass метку sizeClass .

Возможно, вы заметили, что оба метода предоставляют параметр UIViewControllerTransitionCoordinator . Этот объект в основном используется для работы с анимацией между контроллерами представления, и он на самом деле не относится к многозадачности Split View, поскольку система обрабатывает анимации. Параметр UIViewControllerTransitionCoordinator существует, поскольку эти UIContentContainer протокола UIContentContainer не являются исключительными для многозадачности с разделенным видом и могут также выполняться в других сценариях.

Запустите приложение на физическом устройстве или в симуляторе iPad Air 2 или iPad Pro. После запуска приложения перетащите курсор с правой стороны экрана и выберите любое приложение в списке.

Выберите приложение Slide Over

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

Начать разделение экрана

Перетащите разделитель, который появляется в середину экрана, как показано на следующем снимке экрана, и отпустите его.

Центрированный разделитель разделенного экрана

Когда ваше приложение вернется обратно, две метки должны обновиться с правильной шириной вида и классом размера по горизонтали.

Обновленные ярлыки

Как с Slide Over и Split View, если вы используете Xcode 7 или более позднюю версию, то ваше приложение автоматически будет поддерживать функцию «картинка в картинке». Для аудиовизуального контента это делается с помощью класса AVPlayerViewController .

Однако прежде чем вы сможете начать использовать Картинку в картинке, вам нужно включить функцию для вашей цели. Выберите цель, откройте вкладку « Возможности » в Навигаторе проекта , включите фоновые режимы и установите флажки « Аудио, AirPlay» и «Картинка в картинке» .

Возможность изображения в картинке

Запустите приложение снова и нажмите кнопку « Воспроизвести видео» . Видео, которое я включил в стартовый проект, начнет воспроизводиться. Во время воспроизведения видео перейдите на главный экран, нажав кнопку «Домой» на вашем устройстве или « Command-Shift-H», если вы используете симулятор.

Кроме того, вы можете нажать маленькую кнопку в левом нижнем углу, чтобы перейти в режим «Картинка в картинке». Вы увидите, что просмотр видео сворачивается и остается на экране, в комплекте с кнопками для повторного открытия, воспроизведения / паузы и закрытия.

Картинка в картинке видео

На этом этапе вы заметите, что если вы нажмете кнопку, чтобы снова начать просмотр видео в полноэкранном режиме, приложение откроется, но контроллер просмотра воспроизведения видео вообще не появится. Вы можете изменить это поведение, согласовав контроллер представления с протоколом AVPlayerViewControllerDelegate .

Начните с ViewController класса ViewController соответствие с протоколом AVPlayerViewControllerDelegate .

1
class ViewController: UIViewController, AVPlayerViewControllerDelegate

Затем замените prepareForSegue(_:sender:) на следующую реализацию:

1
2
3
4
5
6
7
8
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let destination = segue.destinationViewController as!
    AVPlayerViewController
    destination.delegate = self
    let url = NSBundle.mainBundle().URLForResource(«Video», withExtension: «mp4»)!
    destination.player = AVPlayer(URL: url)
    destination.player?.play()
}

Наконец, добавьте метод playerViewControllerShouldAutomaticallyDismissAtPictureInPictureStart(_: AVPlayerViewController) протокола AVPlayerViewControllerDelegate в класс ViewController .

1
2
3
func playerViewControllerShouldAutomaticallyDismissAtPictureInPictureStart(playerViewController: AVPlayerViewController) -> Bool {
    return false
}

Реализуя этот метод, мы гарантируем, что контроллер просмотра видеопроигрывателя не закрывается при входе в режим «картинка в картинке». Снова соберите и запустите приложение, и вы увидите, что при повторном открытии из рисунка в картинке видео продолжит воспроизводиться.

Если вы не используете AVPlayerViewController для воспроизведения своего контента, есть и другие способы, которыми вы можете поддерживать видео «картинка в картинке». Если вы используете AVPlayerLayer для создания пользовательского интерфейса вокруг вашего видео, вы можете создать объект AVPictureInPictureController для поддержки функции «картинка в картинке». Вот как могла бы выглядеть такая реализация:

01
02
03
04
05
06
07
08
09
10
11
self.pictureinPictureController = AVPictureInPictureController(playerLayer: layer)
self.pictureinPictureController.delegate = // Any object conforming to the AVPictureInPictureViewControllerDelegate protocol
if AVPictureInPictureController.isPictureInPictureSupported() {
    // Display button to enter Picture in Picture
}
 
 
func pictureinPictureButtonPressed() {
    self.pictureInPictureController.startPictureInPicture()
}

Если по какой-то причине вы не хотите, чтобы ваше приложение поддерживало режим «Скольжение», «Разделение» или «Картинка в картинке», вы можете переопределить поведение по умолчанию, предоставляемое Xcode и iOS.

Для просмотра слайдов и разделенного просмотра все, что вам нужно сделать, это добавить ключ UIRequiresFullScreen в файл Info.plist вашего приложения и установить для него значение YES .

С классом AVPlayerViewController вам просто нужно установить для свойства allowsPictureInPicturePlayback значение false .

Для Картинки в Картинке с объектом AVPlayerLayer вы не создаете AVPictureInPictureController .

Наконец, для видео, отображаемых через Интернет с помощью WKWebView , необходимо установить для свойства allowsPictureInPicturePlayback configuration значение false .

Теперь вы должны быть уверены в создании приложений, которые поддерживают новые функции многозадачности «Скольжение», «Разделение на части» и «Картинка в картинке», добавленные в iPad на iOS 9. Как вы можете видеть, эти новые функции делают iPad гораздо более производительным инструментом, и они разработчикам очень легко реализовать в собственных приложениях.

Как всегда, вы можете оставить свои комментарии и отзывы в комментариях ниже.