9

我的彈窗顯示有問題。在initWithContentViewController:presentPopoverFromBarButtonItem:permittedArrowDirections:animated:之後,它會切割導航欄的邊角。我應該如何解決?謝謝。UIPopoverController和UINavigationController削減角落

Clipping corners of navigation bar

這是我使用的代碼

NavContr *nav = [NavContr new]; 
    nav.navigationBar.backgroundColor = [UIColor redColor]; 
    UIPopoverController *tempPop = [[UIPopoverController alloc] initWithContentViewController:nav]; 
    [tempPop presentPopoverFromBarButtonItem:mainButtonItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:NO]; 

編輯:我已經解決了這個問題:

+ (void)configure:(UINavigationController *)navController { 
    UINavigationBar *navigationBar = navController.navigationBar;  
    UIView *contentView = nil; 

    for (UIView *view in navController.view.subviews) { 
     if ([[NSString stringWithFormat:@"%@", [view class]] isEqualToString:@"UILayoutContainerView"]) 
      contentView = view; 
    } 

    // setting frame to navigation bar and content view 
    [navigationBar setFrame:CGRectMake(navigationBar.frame.origin.x, 0, navigationBar.frame.size.width, navigationBar.frame.size.height)]; 
    [contentView setFrame:CGRectMake(contentView.frame.origin.x, 0, contentView.frame.size.width, contentView.frame.size.height + navigationBar.frame.size.height)]; 

    [navController.view bringSubviewToFront:contentView]; 

    for (UIView *customView in contentView.subviews) 
     customView.frame = CGRectMake(customView.frame.origin.x, customView.frame.origin.y + navigationBar.frame.size.height, customView.frame.size.width, customView.frame.size.height); 

    [contentView addSubview:navigationBar]; 
    [contentView bringSubviewToFront:navigationBar]; 
} 
+0

給請完整的代碼生成UIPopoverController – Injectios 2012-03-14 11:43:59

+0

嘗試一些的viewController添加到您的導航控制器 – Injectios 2012-03-14 11:53:56

+0

您不能更改此功能。可能有一些無證的方法可以實現,但實施它可能會讓您的應用被Apple拒絕。 – RLH 2012-03-21 20:27:13

回答

10

這可能是因爲您沒有根視圖控制器,或者以其他方式與導航控制器一起擺弄它,而不是用於播放它。這是怎樣你應該是建立酥料餅:

MyCustomViewController *viewController = [[UIViewController alloc] initWithNibName:@"MyCustomViewController" bundle:nil]; //or storyboard or whatever 
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController]; //you should have a root view controller before displaying the popover 
tintColor = [UIColor redColor]; 
UIPopoverController *tempPop = [[UIPopoverController alloc] initWithContentViewController:nav]; 
[tempPop presentPopoverFromBarButtonItem:mainButtonItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:NO]; 

有這裏發生了一些非常重要的事情:

  • 你的導航控制器應該有一個根視圖控制器,你顯示它之前。
  • 此代碼使用標準UINavigationController實例。根據documentation,你不應該子類UINavigationController,也不應該試圖重新發明輪子。 Apple已經創建了一個複雜而全面的框架UIKit,您可以使用它來構建令人驚歎的應用程序。如果你試着跳出盒子,你會爲自己創造大量的工作而沒有任何明顯的好處。
  • 這是使用UINavigationBar類的tintColor屬性。如果色彩對於用戶界面不夠用,您也可以手動設置背景圖像(請參閱docs)。

如果要使用導航控制器製作彈出窗口,請使用內置的UINavigationController類。不要繼承它,也不要重新創造它。要自定義navigationBar的外觀,請使用UINavigationBar類中的UI_APPEARANCE_SELECTOR方法。

0

enter image description here

我已經試過&複製你所面臨的問題,提出了一些[R & D.這是由於下面的代碼行:

nav.navigationBar.backgroundColor = [UIColor redColor]; 

當您將導航欄的背景顏色就會表現應有的天然形狀怪異彈出。嘗試並刪除下面的行,你一定會有問題解決。

+0

我已經有了UINavigationController – LightNight 2012-03-22 14:45:49

0

如果您指定出現彈出窗口的Rect,我們發現使用小數可能導致奇怪的失真。請確保您使用的是原號和尺寸的整數。

3

我得到的解決方案之前,添加的CALayer的UIPopOverController顯示像rounded
表視圖類中添加以下行後,我得到以下UIPopOverController

#import <QuartzCore/QuartzCore.h> 

CALayer *imageLayer2 = self.tableView.layer; 
[imageLayer2 setCornerRadius:-20]; 
[imageLayer2 setBorderWidth:1]; 

non rounded

嘗試在您的項目可能是它的作品!
感謝名單