В iOS 13 есть новое поведение для модального контроллера представления, когда представлено.
Теперь это не полноэкранный режим по умолчанию, и когда я пытаюсь скользить вниз, приложение просто автоматически отключает View Controller.
Как я могу предотвратить это поведение и вернуться к старому полноэкранному модальному vc?
Спасибо
ios
viewcontroller
modalviewcontroller
ios13
pascalbros
источник
источник
fullScreen
Опция должна быть по умолчанию для предотвращения разрыва изменений пользовательского интерфейса.isModalInPresentation
чтобы заблокировать жест смахивания от отклонения. Смотрите мой блог для более подробной информации: medium.com/@hacknicity/….automatic
стиль установился как стиль по умолчанию, который является (для большинства контроллеров представления).pageSheet
стилем. Однако некоторые контроллеры системного представления могут отображать его в другом стиле.Я добавляю информацию, которая может быть полезна для кого-то. Если у вас есть какой-либо сценарий, чтобы вернуться к старому стилю, вам нужно установить для свойства kind значение Present Modally, а для свойства Presentation - Full Screen .
источник
performSegue
. Спасибо, дорогой!У меня была эта проблема на начальном экране сразу после экрана запуска. Для меня, поскольку у меня не было определенной последовательности или логики, было переключение презентации с автоматического на полноэкранный режим, как показано здесь:
источник
Есть несколько способов сделать это, и я думаю, что каждый из них может подходить для одного проекта, но не для другого, поэтому я подумал, что оставлю их здесь, может быть, кто-то другой перейдет к другому делу.
1- переопределить настоящее
Если у вас есть,
BaseViewController
вы можете переопределитьpresent(_ viewControllerToPresent: animated flag: completion:)
метод.Используя этот способ, вам не нужно вносить никаких изменений в любой
present
вызов, так как мы просто переопределилиpresent
метод.2- Расширение:
Применение:
3- Для одного UIViewController
4- из раскадровки
Выберите переход и установите презентацию на
FullScreen
.5- Swizzling
Использование:
В вашем
AppDelegate
внутреннемapplication(_ application: didFinishLaunchingWithOptions)
добавьте эту строку:Используя этот способ, вам не нужно вносить никаких изменений в любой текущий вызов, так как мы заменяем текущую реализацию метода во время выполнения.
Если вам нужно знать, что происходит, вы можете проверить эту ссылку: https://nshipster.com/swift-objc-runtime/
источник
Я использовал Swizzling для IOS 13
тогда положи это
где-то
например в AppDelegate
источник
static let
, ленив, ты должен прочитать это, чтобы позволить этому быть вычисленным, ленивый var вычислен только один раз, я использую это, чтобы гарантировать, что swizzling вызвал однаждыДля пользователей Objective-C
Просто используйте этот код
Или, если вы хотите добавить его в iOS 13.0, используйте
источник
Один лайнер:
modalPresentationStyle
должен быть установлен на навигационном контроллере, который представлен .Протестированный код
modalPresentationStyle требуется установить в navigationController .
источник
Как подсказка: если вы вызываете подарок,
ViewController
который встроен в,NavigationController
вы должны установитьNavigationController
для.fullScreen
а не для VC.Вы можете сделать это как @davidbates или сделать это программно (например, @pascalbros).
Пример сценария:
источник
Мне нужно было сделать оба:
Установить стиль презентации на полный экран
Установить верхнюю панель как полупрозрачную панель навигации
источник
Изменить
modalPresentationStyle
перед представлениемисточник
Вот простое решение без кодирования одной строки.
Это изменение приводит к тому, что приложение iPad будет работать так, как ожидалось, иначе новый экран будет отображаться в центре экрана в виде всплывающего окна.
источник
Если у вас есть UITabController с экранами со встроенными контроллерами навигации, вы должны установить презентацию UITabController на FullScreen, как показано на рисунке ниже.
источник
Вот решение для Objective-C
источник
Последний для iOS 13 и Swift 5.x
источник
Вот моя версия исправления в ObjectiveC с использованием категорий. При таком подходе вы будете иметь поведение UIModalPresentationStyleFullScreen по умолчанию, пока не будет явно задано другое.
источник
Все остальные ответы достаточны, но для такого большого проекта, как наш, и в котором навигация осуществляется как в коде, так и в раскадровке, это довольно сложная задача.
Для тех, кто активно использует раскадровку. Это мой совет: используйте Regex.
Следующий формат не подходит для полноэкранных страниц:
Следующий формат подходит для полноэкранных страниц:
Следующее регулярное выражение, совместимое с VS CODE, преобразует все страницы старого стиля в новые страницы стиля. Вам может понадобиться экранировать специальные символы, если вы используете другие движки регулярных выражений / текстовые редакторы.
Поиск регулярных выражений
Заменить регулярное выражение
источник
Первоначально значение по умолчанию
fullscreen
для modalPresentationStyle, но в iOS 13 его изменения вUIModalPresentationStyle.automatic
.Если вы хотите , чтобы контроллер полного экрана , вы должны изменить
modalPresentationStyle
кfullScreen
.Обратитесь к
UIModalPresentationStyle
документации Apple для получения более подробной информации и обратитесь к руководству по интерфейсу Apple для людей, где следует использовать, какой способ.источник
Вы можете легко сделать это. Откройте раскадровку как исходный код и выполните поиск
kind="presentation"
, во всех тегах seague с kind = presentation добавьте дополнительный атрибут.modalPresentationStyle="fullScreen"
источник
// если вы хотите отключить смахивание, чтобы закрыть его, добавьте строку
Проверьте Apple Document для получения дополнительной информации.
источник
Я добился этого с помощью метода Swizzling (Swift 4.2):
Чтобы создать расширение UIViewController следующим образом
и в AppDelegate, в приложении: didFinishLaunchingWithOptions: вызвать сверкающий код, вызвав:
источник
Это сработало для меня:
yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
источник
Создайте категорию для UIViewController (скажем, UIViewController + PresentationStyle). Добавьте следующий код к нему.
источник
альтернативный подход состоит в том, чтобы иметь свой собственный базовый компонент viewcontroller в вашем приложении и просто реализовать назначенные и требуемые инициализаторы с базовой настройкой, что-то вроде следующего:
НОТА . Если ваш контроллер представления содержится в навигационном контроллере, который фактически представлен модально, тогда навигационный контроллер должен подходить к проблеме таким же образом (то есть настраивать свой пользовательский компонент контроллера навигации таким же образом.
Протестировано на Xcode 11.1 на iOS 13.1 и iOS 12.4
Надеюсь, поможет
источник
У меня была эта проблема с видео, не представляющим полноэкранный режим. Добавил эту строчку, которая спасла день :-)
источник
Самое простое решение, которое сработало для меня.
источник
Если вы используете UINavigationController и встраиваете ViewController в качестве корневого контроллера представления, то вы также столкнетесь с такой же проблемой. Используйте следующий код для преодоления.
источник
Вместо того чтобы вызывать
self.modalPresentationStyle = .fullScreen
каждый контроллер представления, вы можете создать подкласс UIViewController и использовать егоMyViewController
везде.источник
Вышеуказанные ответы и предложения верны, ниже приведена другая версия, и эффективный способ ее использования программно.
# 1 Создано расширение UIView
# 2 Создал метод ()
Вызывая как показано ниже
ИЛИ
источник