Представление модального в iOS 13 во весь экран

На самом деле только ответ Джона (сент. 5'11 в 9:37) с BaseStream.Seek работал для моего дела. Спасибо, Джон! Мне нужно было добавить строки в zip-архив txt-файл.

using (FileStream zipFS = new FileStream(@"c:\Temp\SFImport\test.zip",FileMode.OpenOrCreate))
{
    using (ZipArchive arch = new ZipArchive(zipFS,ZipArchiveMode.Update))
    {
        ZipArchiveEntry entry = arch.GetEntry("testfile.txt");
        if (entry == null)
        {
            entry = arch.CreateEntry("testfile.txt");
        }
        using (StreamWriter sw = new StreamWriter(entry.Open()))
        {
            sw.BaseStream.Seek(0,SeekOrigin.End);
            sw.WriteLine("text content");
        }
    }
}
61
задан pascalbros 5 June 2019 в 14:19
поделиться

18 ответов

Как подсказка: при вызове подарка к ViewController, который встраивается в NavigationController, необходимо установить NavigationController на .fullScreen а не VC.

можно сделать это как @davidbates, или Вы делаете это программно (как @pascalbros).

сценарий в качестве примера:

enter image description here

    //BaseNavigationController: UINavigationController {}
    let baseNavigationController = storyboard!.instantiateViewController(withIdentifier: "BaseNavigationController")
    var navigationController = UINavigationController(rootViewController: baseNavigationController)
    navigationController.modalPresentationStyle = .fullScreen
    navigationController.topViewController as? LoginViewController
    self.present(navigationViewController, animated: true, completion: nil)
20
ответ дан 23 November 2019 в 02:16
поделиться

Если у Вас есть UITabController с Экранами со Встроенными Контроллерами Навигации, необходимо установить презентацию UITabController на FullScreen как показано в рис. ниже

enter image description here

10
ответ дан 23 November 2019 в 02:16
поделиться
let Obj = MtViewController()
Obj.modalPresentationStyle = .overFullScreen
self.present(Obj, animated: true, completion: nil)

//, если Вы хотите отключить сильный удар для отклонения на нем, добавьте строку

Obj.isModalInPresentation = true

Проверка Документ Apple для Большего количества информации

2
ответ дан 23 November 2019 в 02:16
поделиться

Вот легкое решение, не кодируя одну строку.

  • Избранный Контроллер Представления в Раскадровке
  • Выбор приписывает Инспектора
  • презентация Набора, "Автоматическая" к "Полному экрану" согласно ниже изображения

, Это изменение делает поведение приложения для iPad как ожидалось иначе, новый экран отображается в центре экрана как всплывающее окно.

enter image description here

9
ответ дан 23 November 2019 в 02:16
поделиться

Я использовал swizzling для iOS 13

import Foundation
import UIKit

private func _swizzling(forClass: AnyClass, originalSelector: Selector, swizzledSelector: Selector) {
    if let originalMethod = class_getInstanceMethod(forClass, originalSelector),
       let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }
}

extension UIViewController {

    static let preventPageSheetPresentation: Void = {
        if #available(iOS 13, *) {
            _swizzling(forClass: UIViewController.self,
                       originalSelector: #selector(present(_: animated: completion:)),
                       swizzledSelector: #selector(_swizzledPresent(_: animated: completion:)))
        }
    }()

    @available(iOS 13.0, *)
    @objc private func _swizzledPresent(_ viewControllerToPresent: UIViewController,
                                        animated flag: Bool,
                                        completion: (() -> Void)? = nil) {
        if viewControllerToPresent.modalPresentationStyle == .pageSheet
                   || viewControllerToPresent.modalPresentationStyle == .automatic {
            viewControllerToPresent.modalPresentationStyle = .fullScreen
        }
        _swizzledPresent(viewControllerToPresent, animated: flag, completion: completion)
    }
}

, затем помещает это

UIViewController.preventPageSheetPresentation

где-нибудь

, например, в AppDelegate

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?) -> Bool {

    UIViewController.preventPageSheetPresentation
    // ...
    return true
}
14
ответ дан 23 November 2019 в 02:16
поделиться

Для пользователей Objective C

Просто Используют этот код

 [vc setModalPresentationStyle: UIModalPresentationFullScreen];

Или если Вы хотите добавить, что он конкретный в iOS 13.0 затем использует

 if (@available(iOS 13.0, *)) {
     [vc setModalPresentationStyle: UIModalPresentationFullScreen];
 } else {
     // Fallback on earlier versions
 }
24
ответ дан 23 November 2019 в 02:16
поделиться

Если бы Вы используете UINavigationController и встраиваете ViewController как корневой контроллер представления, то также Вы поднялись бы с той же проблемой. Используйте следующий код для преодоления.

let vc = UIViewController()
let navController = UINavigationController(rootViewController: vc)
navController.modalPresentationStyle = .fullScreen
0
ответ дан 23 November 2019 в 02:16
поделиться

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

#1 Создал Расширение UIView

, #2 Создал Метод ()

//#1
extension UIViewController {

//#2
func presentLocal(_ viewControllerToPresent: UIViewController, animated flag: 
Bool, completion: (() -> Void)? = nil) {

//Reusing below 2 lines :-)
viewControllerToPresent.modalPresentationStyle = .overCurrentContext
self.present(viewControllerToPresent, animated: flag, completion: completion)

  }
}

Вызов как ниже

let vc = MyViewController()
let nc = UINavigationController(rootViewController: vc)
sourceView.presentLocal(nc, animated: true, completion: nil)

ИЛИ

let vc = MyViewController()
sourceView.presentLocal(vc, animated: true, completion: nil)
-1
ответ дан 23 November 2019 в 02:16
поделиться

альтернативный подход должен иметь Вашу собственную базу viewcontroller компонент в Вашем приложении и просто реализация обозначенных и необходимых инициализаторов с основной установкой, чем-то как следующее:

class MyBaseViewController: UIViewController {

//MARK: Initialisers

/// Alternative initializer which allows you to set the modal presentation syle
/// - Parameter modalStyle: the presentation style to be used
init(with modalStyle:UIModalPresentationStyle) {
    super.init(nibName: nil, bundle: nil)
    self.setup(modalStyle: modalStyle)
}

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    // default modal presentation style as fullscreen
    self.setup(modalStyle: .fullScreen)
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    // default modal presentation style as fullscreen
    self.setup(modalStyle: .fullScreen)
}

//MARK: Private

/// Setup the view
///
/// - Parameter modalStyle: indicates which modal presentation style to be used
/// - Parameter modalPresentation: default true, it prevent modally presented view to be dismissible with the default swipe gesture
private func setup(modalStyle:UIModalPresentationStyle, modalPresentation:Bool = true){
    if #available(iOS 13, *) {
        self.modalPresentationStyle = modalStyle
        self.isModalInPresentation = modalPresentation
    }
}

ПРИМЕЧАНИЕ : Если Ваш контроллер представления содержится в контроллере навигации, который на самом деле представлен модально, то контроллер навигации должен приблизиться к проблеме таким же образом (значение, имея Ваш пользовательский компонент контроллера навигации, настроенный таким же образом

Протестированный на Xcode 11.1 на iOS 13.1 и iOS 12.4

Hope, которому это помогает

0
ответ дан 23 November 2019 в 02:16
поделиться

Простое решение, которое работало на меня.

viewController.modalPresentationStyle = .fullScreen
0
ответ дан 23 November 2019 в 02:16
поделиться

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

1-Переопределений, существующих

, Если Вы имеете BaseViewController, можно переопределить present(_ viewControllerToPresent: animated flag: completion:) метод.

class BaseViewController: UIViewController {

  // ....

  override func present(_ viewControllerToPresent: UIViewController,
                        animated flag: Bool,
                        completion: (() -> Void)? = nil) {
    viewControllerToPresent.modalPresentationStyle = .fullScreen
    super.present(viewControllerToPresent, animated: flag, completion: completion)
  }

  // ....
}

Используя этот путь Вы не должны делать никакого изменения ни на каком present вызов, когда мы просто переопределили present метод.

2-расширение:

extension UIViewController {
  func presentInFullScreen(_ viewController: UIViewController,
                           animated: Bool,
                           completion: (() -> Void)? = nil) {
    viewController.modalPresentationStyle = .fullScreen
    present(viewController, animated: animated, completion: completion)
  }
}

Использование:

presentInFullScreen(viewController, animated: true)

3-Для одного UIViewController

let viewController = UIViewController()
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: true, completion: nil)

4-От Раскадровки

Выбор переход и набор презентация к [1 110].
enter image description here

использование 5-Swizzling

extension UIViewController {

  static func swizzlePresent() {

    let orginalSelector = #selector(present(_: animated: completion:))
    let swizzledSelector = #selector(swizzledPresent)

    guard let orginalMethod = class_getInstanceMethod(self, orginalSelector), let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) else{return}

    let didAddMethod = class_addMethod(self,
                                       orginalSelector,
                                       method_getImplementation(swizzledMethod),
                                       method_getTypeEncoding(swizzledMethod))

    if didAddMethod {
      class_replaceMethod(self,
                          swizzledSelector,
                          method_getImplementation(orginalMethod),
                          method_getTypeEncoding(orginalMethod))
    } else {
      method_exchangeImplementations(orginalMethod, swizzledMethod)
    }

  }

  @objc
  private func swizzledPresent(_ viewControllerToPresent: UIViewController,
                               animated flag: Bool,
                               completion: (() -> Void)? = nil) {
    if #available(iOS 13.0, *) {
      if viewControllerToPresent.modalPresentationStyle == .automatic {
        viewControllerToPresent.modalPresentationStyle = .fullScreen
      }
    }
    swizzledPresent(viewControllerToPresent, animated: flag, completion: completion)
   }
}

:
В Вашем AppDelegate внутренний application(_ application: didFinishLaunchingWithOptions) добавляют эту строку:

UIViewController.swizzlePresent()

Используя этот путь Вы не должны делать никакого изменения ни на каком существующем вызове, поскольку мы заменяем реализацию настоящего метода во времени выполнения.
, Если необходимо знать то, что является swizzling, можно проверить эту ссылку: https://nshipster.com/swift-objc-runtime /

48
ответ дан 23 November 2019 в 02:16
поделиться
class MyViewController: UIViewController {

    convenience init() {
        self.init(nibName:nil, bundle:nil)
        self.modalPresentationStyle = .fullScreen
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

, А не вызов self.modalPresentationStyle = .fullScreen для каждого контроллера представления, можно разделить UIViewController на подклассы и просто использовать MyViewController везде.

0
ответ дан 23 November 2019 в 02:16
поделиться

Это работало на меня:

yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen

1
ответ дан 23 November 2019 в 02:16
поделиться

Все другие ответы достаточны, но для крупного проекта как наш и где навигация делается и в коде и в раскадровке, это - настоящая грандиозная задача.

enter image description here

Для тех, кто активно использует Раскадровку. Это - мой совет: используйте Regex.

следующий формат не хорош для полноэкранных страниц:

<segue destination="Bof-iQ-svK" kind="presentation" identifier="importSystem" modalPresentationStyle="fullScreen" id="bfy-FP-mlc"/>

следующий формат хорош для полноэкранных страниц:

<segue destination="7DQ-Kj-yFD" kind="presentation" identifier="defaultLandingToSystemInfo" modalPresentationStyle="fullScreen" id="Mjn-t2-yxe"/>

следующее regex совместимое с VS CODE преобразует все страницы Old Style в модернизированные страницы. Вы, возможно, должны выйти из специальных символов при использовании других regex механизмов/текстовых редакторов.

Поисковый Regex

<segue destination="$1" kind="presentation" identifier="$2" modalPresentationStyle="fullScreen" id="$3"/>
Замены Regex

<segue destination="(.*)"\s* kind="show" identifier="(.*)" id="(.*)"/>

5
ответ дан 23 November 2019 в 02:16
поделиться

У меня была эта проблема с видео не представление полного экрана больше. Добавленный эта строка, которая спасла положение :-)

videoController.modalPresentationStyle = UIModalPresentationFullScreen;
0
ответ дан 23 November 2019 в 02:16
поделиться

Первоначально, значение по умолчанию fullscreen для modalPresentationStyle, но в [1 110] iOS 13 его изменения в UIModalPresentationStyle.automatic.

, Если Вы хотите сделать полноэкранный контроллер представления, необходимо измениться modalPresentationStyle на fullScreen.

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

1
ответ дан 23 November 2019 в 02:16
поделиться

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

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

первый контроллер появляется как это:

enter image description here

, Если я затем непосредственно перехожу к другому NavigationController с ViewController, это похоже на это:

enter image description here

Да ведь во втором ViewController, правильная кнопка против края а не поля? Также отметьте уменьшенную высоту.

, Если я изменяю первый navigationcontroller на полный экран, второй появляется правильно.

0
ответ дан 23 November 2019 в 02:16
поделиться

Вот решение для Objective C

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc = [storyBoard instantiateViewControllerWithIdentifier:@"ViewController"];

vc.modalPresentationStyle = UIModalPresentationFullScreen;

[self presentViewController:vc animated:YES completion:nil];
4
ответ дан 23 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: