UISplitViewController - что это, для чего используется и как реализован? Какие недавние изменения в нем появились?ios-86

Что такое UISplitViewController?

UISplitViewController - это контейнерный контроллер, предназначенный для отображения двух панелей интерфейса (master-detail) с возможностью адаптации под разные размеры экранов и ориентации устройства. Основные характеристики:

  • Первичное использование на iPad, но адаптируется и для iPhone
  • Состоит из двух (реже трех) дочерних контроллеров:
    • Primary (ранее Master) - обычно список или навигационное меню
    • Secondary (ранее Detail) - контент, связанный с выбором в Primary
  • Автоматически адаптирует layout в зависимости от размера устройства и ориентации

Основные сценарии использования

  1. Почтовые клиенты (список писем + содержимое письма)
  2. Файловые менеджеры (список файлов + превью)
  3. Настройки приложения (категории + детальные настройки)
  4. Любые приложения с иерархической навигацией

Базовая реализация

Вот минимальный пример настройки:

class MainSplitViewController: UISplitViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let primaryVC = PrimaryViewController()
        let secondaryVC = SecondaryViewController()

        viewControllers = [
            UINavigationController(rootViewController: primaryVC),
            UINavigationController(rootViewController: secondaryVC)
        ]

        // Современные настройки
        preferredDisplayMode = .oneBesideSecondary
        showsSecondaryOnlyButton = true
        primaryBackgroundStyle = .sidebar
    }
}

Ключевые свойства и методы

// Управление отображением
var preferredDisplayMode: UISplitViewController.DisplayMode
var preferredSplitBehavior: UISplitViewController.SplitBehavior

// Контроллеры
var viewControllers: [UIViewController]
var primaryViewController: UIViewController?
var secondaryViewController: UIViewController?

// Стили
var primaryBackgroundStyle: UISplitViewController.BackgroundStyle
var preferredPrimaryColumnWidthFraction: CGFloat

// Делегат
weak var delegate: UISplitViewControllerDelegate?

Современные изменения

1. Новые DisplayMode

  • .oneBesideSecondary - заменил .allVisible
  • .secondaryOnly - только детальный вид
  • .oneOverSecondary - primary поверх secondary

2. SplitBehavior

  • .tile - классическое разделение
  • .overlay - secondary поверх primary
  • .displace - secondary сдвигает primary

3. Sidebar

Интеграция с новым UICollectionView sidebar style:

if let nc = primaryViewController as? UINavigationController {
    nc.navigationBar.prefersLargeTitles = true
    nc.navigationItem.largeTitleDisplayMode = .always
}

4. Compact поддержка

Улучшенная адаптация для iPhone:

  • Автоматический переход в compact режим
  • Возможность кастомного поведения через splitViewController(_:topColumnForCollapsingToProposedTopColumn:)

5. Scene API интеграция

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

  • Корректная работа с несколькими окнами
  • Сохранение состояния при переключении между сценами

Практические советы

  1. Всегда используйте NavigationController для обоих панелей
  2. Настраивайте preferredDisplayMode в зависимости от контекста
  3. Реализуйте UISplitViewControllerDelegate для тонкой настройки поведения
  4. Для iPadOS 14+ используйте новый sidebar стиль
  5. Тестируйте на всех устройствах и ориентациях

Пример делегата:

extension MainSplitViewController: UISplitViewControllerDelegate {
    func splitViewController(
        _ svc: UISplitViewController,
        topColumnForCollapsingToProposedTopColumn proposedTopColumn: UISplitViewController.Column
    ) -> UISplitViewController.Column {
        // Кастомная логика для compact режима
        return .primary
    }

    func splitViewController(
        _ svc: UISplitViewController,
        displayModeForExpandingToProposedDisplayMode proposedDisplayMode: UISplitViewController.DisplayMode
    ) -> UISplitViewController.DisplayMode {
        // Настройка при переходе в regular ширину
        return .oneBesideSecondary
    }
}

Резюмируем:

UISplitViewController - мощный инструмент для создания адаптивных интерфейсов, особенно на iPad. Современные изменения (iOS 14+) сделали его более гибким и удобным, с улучшенной поддержкой sidebar стиля и адаптацией под разные размеры экранов.