【问题标题】:UIPopoverController and UINavigationController cuts cornersUIPopoverController 和 UINavigationController 偷工减料
【发布时间】:2012-03-14 11:32:33
【问题描述】:

我的弹出框显示有问题。在initWithContentViewController:presentPopoverFromBarButtonItem:permittedArrowDirections:animated: 之后,它会切入导航栏的角落。我该怎么修??谢谢。

这是我正在使用的代码

    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];
}

【问题讨论】:

  • 请给出生成UIPopoverController的完整代码
  • 尝试添加一些 viewController 到你的导航控制器
  • 您无法更改此功能。可能有一些未记录的方法可以做到这一点,但实施它很可能会导致您的应用被 Apple 拒绝。
  • @LastNight 您的问题将得到解决,请查看我在此页面中的回答。我在最后复制了你的场景并得出了结论。看看@我的回答。
  • 试试这个stackoverflow.com/questions/12440250/… 它对我有用。

标签: iphone objective-c uinavigationcontroller uipopovercontroller


【解决方案1】:

这可能是因为您没有根视图控制器,或者以其他方式摆弄导航控制器,而不是用来玩。这就是您应该设置弹出框的方式:

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 属性。如果你的 UI 色调不够,你也可以手动设置背景图片(参考docs)。

如果您想使用导航控制器制作弹出框,请使用内置的UINavigationController 类。不要子类化它,也不要重新发明它。要自定义navigationBar 的外观,请使用UINavigationBar 类中的UI_APPEARANCE_SELECTOR 方法。

【讨论】:

    【解决方案2】:

    我在添加 CALayer 之前得到了解决方案,UIPopOverController 显示像
    在表视图类中添加以下行后,我得到以下 UIPopOverController

    #import <QuartzCore/QuartzCore.h>
    
    CALayer *imageLayer2 = self.tableView.layer;
    [imageLayer2 setCornerRadius:-20];
    [imageLayer2 setBorderWidth:1];
    

    在您的项目中尝试它可能有效!
    谢谢

    【讨论】:

      【解决方案3】:

      我已经尝试并复制了您面临的问题,并进行了一些研发。这是由于下面的代码行:

      nav.navigationBar.backgroundColor = [UIColor redColor];
      

      当您设置导航栏的背景颜色时,由于弹出窗口的原生形状,它的行为会很奇怪。尝试删除以下行,您肯定会解决问题。

      【讨论】:

        【解决方案4】:

        如果您指定弹出框出现的 Rect,我们发现使用小数会导致类似的奇怪扭曲。确保您使用整数作为原点和大小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多