На самом деле только ответ Джона (сент. 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");
}
}
}
Как подсказка: при вызове подарка к ViewController
, который встраивается в NavigationController
, необходимо установить NavigationController
на .fullScreen
а не VC.
можно сделать это как @davidbates, или Вы делаете это программно (как @pascalbros).
сценарий в качестве примера:
//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)
Если у Вас есть UITabController с Экранами со Встроенными Контроллерами Навигации, необходимо установить презентацию UITabController на FullScreen как показано в рис. ниже
let Obj = MtViewController()
Obj.modalPresentationStyle = .overFullScreen
self.present(Obj, animated: true, completion: nil)
//, если Вы хотите отключить сильный удар для отклонения на нем, добавьте строку
Obj.isModalInPresentation = true
Проверка Документ Apple для Большего количества информации
Вот легкое решение, не кодируя одну строку.
, Это изменение делает поведение приложения для iPad как ожидалось иначе, новый экран отображается в центре экрана как всплывающее окно.
Я использовал 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
}
Для пользователей Objective C
Просто Используют этот код
[vc setModalPresentationStyle: UIModalPresentationFullScreen];
Или если Вы хотите добавить, что он конкретный в iOS 13.0 затем использует
if (@available(iOS 13.0, *)) {
[vc setModalPresentationStyle: UIModalPresentationFullScreen];
} else {
// Fallback on earlier versions
}
Если бы Вы используете UINavigationController и встраиваете ViewController как корневой контроллер представления, то также Вы поднялись бы с той же проблемой. Используйте следующий код для преодоления.
let vc = UIViewController()
let navController = UINavigationController(rootViewController: vc)
navController.modalPresentationStyle = .fullScreen
Вышеупомянутые ответы и предложения являются правильными, ниже другая версия и эффективный способ использовать программно.
#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)
альтернативный подход должен иметь Вашу собственную базу 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, которому это помогает
Простое решение, которое работало на меня.
viewController.modalPresentationStyle = .fullScreen
Существует несколько способов сделать это, и я думаю, что каждый мог соответствовать для одного проекта, но не другого, таким образом, я думал, что сохраню их здесь, возможно, кто-то еще будет работать к другому случаю.
, Если Вы имеете 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
метод.
extension UIViewController {
func presentInFullScreen(_ viewController: UIViewController,
animated: Bool,
completion: (() -> Void)? = nil) {
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: animated, completion: completion)
}
}
Использование:
presentInFullScreen(viewController, animated: true)
let viewController = UIViewController()
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: true, completion: nil)
Выбор переход и набор презентация к [1 110].
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 /
class MyViewController: UIViewController {
convenience init() {
self.init(nibName:nil, bundle:nil)
self.modalPresentationStyle = .fullScreen
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
, А не вызов self.modalPresentationStyle = .fullScreen
для каждого контроллера представления, можно разделить UIViewController на подклассы и просто использовать MyViewController
везде.
Это работало на меня:
yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
Все другие ответы достаточны, но для крупного проекта как наш и где навигация делается и в коде и в раскадровке, это - настоящая грандиозная задача.
Для тех, кто активно использует Раскадровку. Это - мой совет: используйте 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="(.*)"/>
У меня была эта проблема с видео не представление полного экрана больше. Добавленный эта строка, которая спасла положение :-)
videoController.modalPresentationStyle = UIModalPresentationFullScreen;
Первоначально, значение по умолчанию fullscreen
для modalPresentationStyle, но в [1 110] iOS 13 его изменения в UIModalPresentationStyle.automatic
.
, Если Вы хотите сделать полноэкранный контроллер представления, необходимо измениться modalPresentationStyle
на fullScreen
.
Относятся UIModalPresentationStyle
документация яблока для получения дополнительной информации и относятся инструкции по интерфейсу пользователя яблока для того, где должен использовать который модальность.
Я должен был переключить некоторые свои контроллеры навигации назад к полному экрану из-за проблемы, которую я не могу выяснить.
, Если у меня есть два набора к автоматическому, тот, который называет другой, второй контроллер появляется с правильной кнопкой против края экрана.
первый контроллер появляется как это:
, Если я затем непосредственно перехожу к другому NavigationController
с ViewController
, это похоже на это:
Да ведь во втором ViewController
, правильная кнопка против края а не поля? Также отметьте уменьшенную высоту.
, Если я изменяю первый navigationcontroller на полный экран, второй появляется правильно.
Вот решение для Objective C
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc = [storyBoard instantiateViewControllerWithIdentifier:@"ViewController"];
vc.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:vc animated:YES completion:nil];