Симптом: на iPhone Duo интерфейс приложения смещается, обрезается или оставляет пустые области. Быстрое решение: воспроизведите сбой в Xcode 27.1, проверьте фиксированные размеры, предположения об ориентации и размещение панелей; обычно достаточно исправить конкретные ограничения, а не переписывать весь экран. Подход особенно важен, если старую сборку нужно проверить перед решением о переходе на iOS 27.1 SDK.
Этот runbook предназначен для независимых разработчиков, которые поддерживают приложение, собранное со старым SDK, и хотят оценить его на iPhone Duo. Он также пригодится, если в SwiftUI или UIKit есть фиксированные размеры, собственная навигация либо экран, зависящий от положения устройства. Небольшие команды, собирающие приложение на удалённом Mac, найдут здесь порядок симуляторной проверки и критерии перед выпуском.
Последнее обновление — 23 октября 2026 года; версии SDK и поведение интерфейса сверены с [руководством Apple по подготовке приложений для iPhone Duo](https://developer.apple.com/iphone-duo/prepare/), [дизайн-рекомендациями для этого устройства](https://developer.apple.com/design/human-interface-guidelines/designing-for-iphone-duo) и [заметками о выпуске Xcode 27.1](https://developer.apple.com/documentation/xcode-release-notes/xcode-27_1-release-notes).Не считайте любую пустую область ошибкой симулятора. Сначала сохраните состояние, в котором она появляется, и сопоставьте фактическую доступную область с ограничениями интерфейса: это помогает не маскировать дефект случайным сдвигом отдельных элементов.
Сначала определите, что означает совместимость старой сборки
Если приложение запускается, это ещё не доказывает, что оно корректно использует доступное пространство экрана. Apple описывает различия между приложениями, собранными с разными версиями SDK: приложения на iOS 27 SDK адаптируются к размерам отображения, а сборка с iOS 27.1 SDK или более новым SDK может использовать более полную компоновку. Для последнего сценария отдельно важны изменения размещения панели инструментов и панели вкладок. Подробности приведены в руководстве Apple для подготовки к iPhone Duo и заметках Xcode 27.1.
Разделяйте три вопроса, которые при первичной проверке легко смешать:
| Состояние сборки | Что следует ожидать | Что проверить перед решением |
|---|---|---|
| Приложение собрано со старым SDK | Совместимый запуск не гарантирует, что экран использует пространство так, как ожидается на iPhone Duo. | Запускается ли ключевой сценарий, видны ли основные действия, не закрыт ли контент системными или собственными панелями. |
| Приложение собрано с iOS 27 SDK | Система может динамически адаптировать отображение к размеру экрана. Это не отменяет проверки собственных фиксированных ограничений. | Меняется ли интерфейс при смене доступного размера и не остаются ли пустые области из-за логики приложения. |
| Приложение собрано с iOS 27.1 SDK или более новым | Доступна более полная компоновка экрана; возможны отличия в поведении панелей инструментов и вкладок. | Достаточно ли места для содержимого, доступны ли кнопки и корректно ли учтены области вокруг панелей. |
Зафиксируйте идентификатор сборки, установленный SDK, конфигурацию симулятора и экран, на котором возникла проблема. Без этих данных сравнение старой и новой сборок превращается в догадку: измениться могли не только SDK, но также настройки проекта, состояние приложения или содержимое экрана.
Затем воспроизведите переход между экранами и размерами
Проблема часто становится заметна не при первом запуске, а при изменении доступной области: приложение переходит с внешнего экрана на внутренний, меняется размер окна или интерфейс получает новое состояние. В таком сценарии код может продолжать использовать ширину устройства, сохранённую при первоначальной загрузке, хотя доступная ширина контейнера уже стала другой. Подготовьте воспроизводимый сценарий, а не исправляйте координаты на глаз.
В iPhone Duo Simulator повторите один переход за раз. Сначала откройте экран в исходном состоянии, затем переключите режим отображения или измените размер окна доступным способом в симуляторе. После каждого перехода сохраните снимок и отметьте, какие элементы сдвинулись, какие обрезались и где появились пустые области. Apple описывает работу с устройством и проверку приложений в руководстве по подготовке; используйте его вместе с инструкциями вашей установленной версии Xcode.
Сравнивайте не только картинки, но и причины изменения компоновки:
| Наблюдение после изменения размера | Что проверить в коде | Как отличить причину от симптома |
|---|---|---|
| Контент не занимает освободившееся место | Фиксированную ширину контейнера, заданные вручную отступы и вычисления от ширины устройства | Сопоставьте размер контейнера до и после перехода; проверьте, пересчитываются ли ограничения. |
| Края текста или карточки обрезаны | Жёсткую высоту, ограничение строк, clipping и вложенные контейнеры | Проверьте содержимое с более длинным текстом и убедитесь, что размер родительской области обновился. |
| Кнопка уехала или оказалась под панелью | Привязку к координатам, нижним отступам и safe area | Сравните её положение относительно безопасной области и края контейнера, а не только относительно всего окна. |
| После возврата экран сохраняет старое расположение | Кэшированный размер, состояние экрана и момент обновления layout | Повторите переход туда и обратно, записав состояние интерфейса на обоих шагах. |
Снимок до и после изменения — это свидетельство проблемы, а не диагноз. Добавьте к нему название экрана, состояние приложения, режим отображения и заметку о том, какой элемент оказался неверно расположен. Если при одном и том же переходе сбой не повторяется, сравните состояние данных и навигации: смещение может быть следствием восстановления экрана, а не расчёта размеров.
Отдельно проверьте панели и области безопасного размещения
Переход на iOS 27.1 SDK может выявить интерфейсные допущения, которые раньше не были заметны, в частности ожидания относительно положения панели инструментов и панели вкладок. Не исправляйте такую проблему, просто смещая все кнопки вручную: сперва установите, перекрывается ли контент, изменился ли доступный размер или собственная панель приложения накладывается на системную область. Указания по поведению интерфейса сверяйте с дизайн-рекомендациями Apple для iPhone Duo.
Проведите проверку как пользователь, а не только как автор макета. Найдите основные действия, убедитесь, что текст кнопок не обрезан, а переключение вкладок и переход назад работают в каждом воспроизводимом состоянии. Если элемент виден, но его нельзя нажать, это уже не только визуальный дефект: проверьте размер и положение области взаимодействия, а также то, не перекрывает ли её соседний контейнер.
В UIKit сравните ручные отступы с safeAreaLayoutGuide: привязка к безопасной области часто точнее отражает доступное для содержимого пространство, но не является универсальной заменой всех ограничений. В SwiftUI разберите иерархию контейнеров, модификаторы размещения и способ, которым экран учитывает безопасную область. Выбирайте правку по конкретному воспроизведению, а не переносите один шаблон на все экраны приложения.
Разделите адаптацию и ошибку состояния в пользовательском интерфейсе
Если приложение использует собственные нарисованные панели, нестандартный контейнер контента, фиксацию ориентации или сложный переход между состояниями, проверяйте эти элементы отдельно. Иначе легко приписать симулятору дефект, вызванный собственной логикой: например, экран может сохранять предыдущую геометрию после закрытия модального окна или заново применять координаты, вычисленные до смены размера.
Для каждого воспроизводимого состояния задайте одинаковый набор проверок: весь ли контент виден, не перекрывает ли его панель, достижимы ли основные действия и сохраняется ли выбранное состояние после перехода. Затем меняйте по одному условию. Если дефект возникает только после поворота или частичного складывания, проверьте повторный расчёт интерфейса при смене положения и правильность восстановления данных. Если он возникает сразу при смене размера, ищите фиксированные ограничения и обращения к старому размеру контейнера.
У самодельных компонентов проверьте две независимые вещи: где они рисуют содержимое и где регистрируют взаимодействие. Правильное изображение не гарантирует, что зона нажатия соответствует видимой кнопке; обратное тоже возможно — зона реагирует в неожиданном месте, хотя сама кнопка выглядит правильно. Сохраните отдельный снимок состояния и повторите действие, чтобы определить, связан ли дефект с геометрией, попаданием по элементу или переходом состояния.
Для ориентационно-зависимого экрана убедитесь, что поддерживаемое поведение согласовано с ограничениями проекта. Не добавляйте отдельный набор экранов для каждого положения только потому, что один макет сместился. В первую очередь проверьте, можно ли дать существующим контейнерам адаптироваться к доступной области и сохранить понятный порядок содержимого. Полностью отдельный макет оправдан лишь тогда, когда этого требуют задачи интерфейса, а не единичный снимок.
Выберите исправление по стеку и подтверждённому дефекту
Не выбирайте SwiftUI или UIKit как «правильный» способ исправления без учёта архитектуры приложения. Полезнее сопоставить симптом с тем местом, где задаётся размер и обрабатывается изменение среды. Официальные сведения о классах размеров SwiftUI и trait collection в UIKit помогают определить, какие данные о доступном интерфейсе может учитывать каждый стек.
| Технология или элемент | Сначала исследуйте | Когда такой подход уместен | Что повторно проверить |
|---|---|---|---|
| SwiftUI | Геометрию родительского контейнера, фиксированные frame, зависимость от среды и обработку безопасных областей | Если размер или положение дочерних элементов задаются относительно условий, которые меняются при переходе | Пересчитывается ли содержимое после смены размера, сохраняется ли порядок действий и не появляется ли clipping. |
| UIKit Auto Layout | Конфликтующие ограничения, привязку к краям контейнера и safe area, обновление traits | Если положение выводится из ограничений, но некоторые значения заданы вручную или не обновляются после изменения среды | Нет ли конфликтов, соответствует ли положение панели безопасной области, сохраняется ли доступность кнопок. |
| Собственный layout или нарисованный компонент | Раздельно геометрию отрисовки, хит-тестирование и обновление состояния | Если стандартная компоновка обходится либо компонент рассчитывает координаты самостоятельно | Совпадают ли видимая и интерактивная области, сбрасываются ли устаревшие размеры после перехода. |
Пошаговая проверка перед принятием исправления
- Зафиксируйте исходное состояние. Запишите версию приложения, SDK сборки и экран, на котором проявляется дефект. Сохраните снимок и пошаговое описание перехода.
- Повторите переход в Xcode 27.1. Проверьте приложение в конфигурации симулятора iPhone Duo и повторите ровно тот сценарий, который вызвал смещение. Убедитесь, что установленная версия Xcode соответствует требованиям проекта и выбранной macOS.
- Снимите размеры в точках перехода. Сравните фактическую область родительского контейнера, безопасную область и размеры элементов до и после изменения экрана или окна. Не подменяйте измерение предположением о размере устройства.
- Найдите фиксированные допущения. Просмотрите заданные вручную ширину и высоту, привязки к ориентации, расчёты от модели устройства и кэширование предыдущих размеров. Для UIKit сопоставьте constraints с изменениями trait collection; для SwiftUI проследите ограничения от родительского контейнера.
- Исправьте конкретное ограничение. Меняйте только код, связанный с воспроизводимым симптомом. Если проблема касается панели, проверяйте её положение и safe area отдельно от ограничений самого содержимого.
- Повторите сценарии и сравните результаты. Проверьте исходное состояние, переход между экранами, изменение размера и возврат. Убедитесь, что основное действие доступно и что изображение соответствует области взаимодействия.
- Примите решение о выпуске отдельно. Симуляторная проверка подтверждает наблюдаемое поведение интерфейса в этой среде, но не заменяет проверку на физическом устройстве, подписи и архива либо оценку результата со стороны App Review.
Если команда выполняет проверку на удалённом Mac, порядок остаётся тем же: откройте проект в доступной установке Xcode 27.1, воспроизведите сценарий в iPhone Duo Simulator, сохраните артефакты сравнения и передайте результат тому, кто принимает решение о сборке. Возможность открыть симулятор удалённо сама по себе не доказывает корректность интерфейса; важны точная версия проекта, воспроизводимость перехода и сохранённые результаты. Перед переносом сборки проверьте официальные системные требования Xcode для установленной версии среды.
FAQ: разбор смещения интерфейса на iPhone Duo
Почему интерфейс может обрезаться или оставлять пустое место?
Проверьте, не ограничивают ли экран фиксированные ширина или высота и не рассчитываются ли отступы по предположению о конкретном устройстве. Затем сравните доступный размер контейнера до и после смены экрана. Если контейнер изменился, а дочерний интерфейс сохранил старую геометрию, ищите ограничение или состояние, которое не пересчитывается.
Как проверить переход между внешним и внутренним экраном?
Откройте воспроизводимый экран в iPhone Duo Simulator, сохраните исходное состояние и выполните переход отдельно от других действий. После смены области проверьте положение контента, доступность кнопок, перенос текста и панели. Запишите, что изменилось, и повторите переход обратно: так проще отделить проблему компоновки от ошибки восстановления состояния.
Может ли положение панели в iOS 27.1 повлиять на старую сборку?
Сравнивайте фактическое поведение старой сборки и приложения, собранного с iOS 27.1 SDK: их отображение не следует считать одинаковым только потому, что обе версии запускаются. В новой сборке отдельно проверьте панели инструментов и вкладок, отступы контента и доступность действий. Не переносите результат одной проверки на все экраны без воспроизведения.
Что именно подтверждает проверка в Xcode 27.1 Simulator?
Она позволяет проверить воспроизводимое поведение интерфейса в конфигурации симулятора: например, изменение размера контейнера, положение элементов и видимость действий при переходах. Это полезное свидетельство для исправления компоновки, но не подтверждение поведения на физическом устройстве или результата рассмотрения приложения. Сохраните параметры сценария и повторите критические проверки отдельно на целевом устройстве.
Если после этой проверки вам нужен Mac для воспроизведения интерфейса, исправления и сборки, сначала сравните удалённую среду с вашим способом разработки: проверьте доступность нужной версии Xcode, способ удалённого доступа и требования проекта. Работа только на локальном компьютере может упираться в нехватку места или необходимость держать отдельную машину для сборки; покупка собственного Mac, напротив, требует расходов на оборудование и его постоянное обслуживание. Удалённый Mac не заменит проверку на физическом iPhone и не гарантирует прохождение App Review, но может быть практичным вариантом, если у вас пока нет подходящей среды для симулятора. Перед выбором изучите руководство по среде Mac и условия аренды Mac, затем сверьте доступную конфигурацию с официальными системными требованиями Xcode.