Представление UIViewController с нестандартным размером

Некоторое время я бил головой о стену. У меня есть приложение для iPad, которое использует Master-Detail SplitViewController в качестве рамки представления. Мне нужно представить диалоговое окно входа в систему, когда приложение сначала загрузится, и пусть он будет нестандартного размера. Я создал сцену UIViewController в основной раскадровке и загрузил VC, когда FirstController загружает первую.

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

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

Это невероятно расстраивает, и я действительно не знаю, куда идти отсюда. Интересно, что после того, как приложение полностью загрузится, я представляю точно такой же VC с помощью крана. Он прекрасно выглядит, используя следующие настройки:

MyViewController *itemDetails; itemDetails = [Globals.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; itemDetails.itemImage.image = imageView.image; itemDetails.jewelryObject = jewelryObject; itemDetails.delegate = self; itemDetails.modalPresentationStyle = UIModalPresentationPageSheet; itemDetails.modalTransitionStyle = UIModalTransitionStyleCoverVertical; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:itemDetails]; itemDetails.navigationItem.title = jewelryObject.itemDescription; [navigationController setModalPresentationStyle:UIModalPresentationFormSheet]; [self presentViewController:navigationController animated:YES completion:nil]; navigationController.view.superview.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; navigationController.view.superview.frame = CGRectMake( itemDetails.view.superview.frame.origin.x, itemDetails.view.superview.frame.origin.y, 540.0f, 450.0f ); navigationController.view.superview.center = self.view.center; self.itemDetails = itemDetails; 

Я так невероятно расстроен, что не могу даже выразить это. Насколько мне нравится программирование для iOS, есть те случайные моменты WTF, которые заставляют меня хотеть, чтобы я был отшельником. Если у кого-то есть «аха!» идеи, которые они могут бросить на меня, я бы очень признателен.

Хорошо, так … Это технически не поддерживается. Нет официального способа представить что-то в определенном размере. Таким образом, реальный ответ на этот вопрос – файл радара с Apple .

Но … Это возможно. Однако, если вы не понимаете код ниже, пожалуйста, не используйте его. Это происходит так:

 #import <objc/runtime.h> UIViewController *viewControllerToPresent = /* ... */; viewControllerToPresent.modalPresentationStyle = UIModalPresentationFormSheet; Ivar instanceVar = class_getInstanceVariable([UIViewController class], "_formSheetSize"); if (instanceVar) { ptrdiff_t offset = ivar_getOffset(instanceVar); CGSize *offsetVCPtr = (CGSize*)(((uintptr_t)(__bridge void*)viewControllerToPresent) + offset); *offsetVCPtr = size; } // Present as usual with presentViewController:animated:completion: 

Это уродливо, но оно работает. Обратите внимание, что я не рекомендую делать это в приложении App Store, так как вы не можете пройти через обзор с чем-то вроде этого. Используйте на свой риск! Помните реальный ответ на свой вопрос – это не может быть сделано с существующим API.

Ну, я наконец понял, как правильно использовать UISplitViewController, поэтому все эти танцы вокруг с настроенными VC были ни с чем. Я вызываю [UISplitViewController presentViewController: анимированный: завершение] после того, как все основные структуры настроены в контроллере подробностей.

Некоторое время я немного заворачивался. Но теперь он работает, поэтому … Победа! 😉

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

Еще раз спасибо!