2012-03-13 78 views
1

我的應用程序中的視圖系統是高度自定義的,並使用大量基於用戶交互(通過對視圖/圖層應用仿射變換完成旋轉)從縱向到橫向手動旋轉的視圖。可能手動旋轉UIPopoverController的視圖?

我想在這些旋轉的視圖中的一個內呈現彈出窗口,但彈出窗口的方向總是相對於設備的方向出現(即,不相對於視圖)。我猜測答案是否定的,但以防萬一有人有一個聰明的想法:有沒有辦法手動旋轉由UIPopoverController呈現的視圖?

回答

1

肖恩,我剛剛測試它的踢,是的,它的作品。 它在viewDidAppear做(至少在我的情況)(如果在viewWillAppear中完成的,它被敲回原來的設置。)

這在一個工作就好了(剛纔測試)有酥料餅90度角。即在我的情況下,我的主視圖是縱向模式,並且彈出窗口旋轉90度。

self.navigationController.view.superview.superview.transform = CGAffineTransformMakeRotation (M_PI/2.0); 
+0

是!看起來你可以做到這一點。我把這個想法做得更遠一些。我將在下面單獨回答。 – Sean 2012-03-15 01:58:27

0

免責聲明:如果你在所有有興趣嘗試讓您的應用進入商店,該代碼幾乎可以肯定是拒絕的理由。它潛入UIKit的私有API中,就蘋果而言這是一個很大的禁忌。

@RunningPink有正確的想法。根據視圖層次結構的設置,彈出窗口可能會比兩個超級視圖備份更遠。 popover本身就是(私人)類_UIPopover的一個實例(至少在iOS 5中)。您可以通過找到這樣的觀點:

UIView *possiblePopover = popoverController.contentViewController.view; 
while (possiblePopover != nil) { 
    // Climb up the view hierarchy 
    possiblePopover = possiblePopover.superview; 
    if ([NSStringFromClass([possiblePopover class]) isEqualToString:@"_UIPopoverView"]) { 
     // We found the popover, break out of the loop 
     break; 
    } 
} 

if (nil != possiblePopover) { 
    // Do whatever you want with the popover 
} 

在這一過程中,我發現,轉化的觀點往往最終使得酥料餅看起來模糊。我發現原因是popover的superview是另一個名爲UIDimmingView的私人類的實例,它負責接受popover之外的觸摸並導致popover消失。在調光視圖上執行旋轉移除了我在彈出窗口中看到的模糊。

但是,轉換調光可能會導致怪異,其中窗口的某些部分未被調光視圖「覆蓋」,因此如果窗口的這些部分被輕敲,彈出不會消失。爲了解決這個問題,我將旋轉應用於調光視圖,重置調光視圖的框架以覆蓋屏幕,然後將彈出視圖翻譯到位。

if (nil != possiblePopover) { 
    // Found the popover view 
    CGAffineTransform rotation = CGAffineTransformMakeRotation(-M_PI_2); 
    CGAffineTransform translation = // Whatever translation in necessary here 

    // Rotate the UIDimming View and reset its frame 
    [possiblePopover.superview setTransform:rotation]; 
    [possiblePopover.superview setFrame:CGRectMake(0, 0, possiblePopover.superview.frame.size.height, possiblePopover.superview.frame.size.width)]; 

    // Translate the popover view 
    [possiblePopover setTransform:translation]; 
} 
1

您是想旋轉彈出窗口還是隻顯示彈出窗口中顯示的內容?你可以通過設置哪些箭頭方向來控制前者。我對後者感興趣,它似乎只是通過抓取內容視圖控制器來工作。 E.g.

aPopoverController.contentViewController.view.transform = CGAffineTransformMakeRotation(M_PI);