2013-01-18 14 views
2

我一直在我的頭上撞牆。我有一個使用Master-Detail SplitViewController作爲演示框架的iPad應用程序。當應用程序第一次加載時,我需要提供一個登錄對話框,並使其具有自定義大小。我在主故事板中創建了一個UIViewController場景,並在第一次加載DetailController時加載VC。用自定義尺寸呈現一個UIViewController

我現在面臨的問題是,我無法控制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時刻讓我希望自己是個隱士。如果有人有「哈哈!」他們可以向我傾訴的見解,我真的很感激。

+0

你有沒有考慮過使用popover viewcontroller?它似乎可能適合這一點。 – rooster117

+0

流行將是最後的手段。我基本上必須確保不允許外接水龍頭,這當​​然是可行的。 這對我來說太神奇了(正如馬特加洛韋指出的那樣),沒有官方的方式來做到這一點。但是我一起啃了一個類似的解決方案,在應用程序的另一部分工作,所以我不明白爲什麼它現在導致了這麼多問題。 我試着將VC加載到SplitViewController首次加載,但VC甚至不顯示。 難以置信的令人沮喪。謝謝,不過。如果我不能很快獲得解決方案,我會繼續提出你的想法。 –

回答

5

好的,所以...這不是技術上的支持。沒有官方的方式來呈現某種尺寸的東西。所以這個問題的真正答案是 - 提交radar with 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無法完成。

+0

我會給這個鏡頭。今天我已經測試了我的智慧。 感謝您的建議。 *有什麼*必須在這個。 –

+0

哦,這不是一個公開的應用程序。它將作爲企業應用程序發佈,所以蘋果公司不會給予官方的祝福。 –

+0

或者更簡單的'[vc setValue:[NSValue valueWithCGSize:size] forKey:@「formSheetSize」]'。 –

1

嗯,我終於想出瞭如何正確使用UISplitViewController,所以所有這些與定製的VC跳舞都沒有。在詳細控制器中設置了所有基本結構後,我調用[UISplitViewController presentViewController:animated:completion]。

我真的搞砸了一段時間。但它現在正在工作,所以...贏得! ;-)

感謝您的全力幫助。我真的很感激。你有我的輪子轉動,這是我需要的。我會在其他方面提出你的建議,只是爲了滿足我自己的好奇心,併爲我的箭袋添加另一個箭頭。

再次感謝!