簡體   English   中英

呈現具有自定義尺寸的UIViewController

[英]Presenting a UIViewController with a custom size

我一直在這頭上撞牆。 我有一個iPad應用程序,使用Master-Detail SplitViewController作為其演示框架。 應用首次加載時,我需要顯示一個登錄對話框,並設置為自定義大小。 我已經在主故事板上創建了一個UIViewController場景,並在第一次加載DetailController時加載了VC。

我遇到的問題是我無法控制VC的大小。 我已經將其定義為FormSheet,以縱向模式顯示。 我將演示文稿設置為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時刻讓我希望自己是個隱士。 如果有人有任何“啊!” 他們可以向我投以深刻的見解,對此我深表感謝。

好的,所以...技術上不支持。 沒有官方的方法可以呈現一定大小的東西。 因此,對這個問題的真正答案是- 向蘋果提起雷達

但是...有可能。 但是,如果您不理解下面的代碼,請不要使用它。 它是這樣的:

#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:animated:completion]。

我真的很忙了一段時間。 但是它現在正在工作,所以...獲獎! ;-)

感謝您所有的幫助。 我真的很感激。 你讓我的車輪轉動了,這就是我所需要的。 為了滿足我自己的好奇心並在箭袋中添加另一個箭頭,我將在其他時候考慮您的建議。

再次感謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM