iPad UIModalPresentationFormSheet与UITabBarController的moreNavigationController编辑模式问题

时间:2012-09-05 18:03:19

标签: ipad uitabbarcontroller

这似乎是一个错误,但我想知道是否有人能想到一个解决方法。

在iPad上,您将视图控制器显示为UIModalPresentationFormSheet。这个视图控制器正在扩展UITabBarController,并有足够的控制器来自动显示“更多”标签栏按钮。点击更多按钮后,它将正确显示列表,但只要点击“编辑”,它就会显示比实际表单更大的编辑视图(在表单内部裁剪),导致内容不在视图,包括带有“完成”按钮的工具栏。解雇的唯一方法是强行退出应用程序。

为了验证它不是我的应用程序特有的东西我启动了一个单一的视图项目,并提出了一个简单的模态视图。这个模态视图控制器扩展了UITabBarController并具有以下init方法:

- (id)init {
    self = [super init];
    if (self) {
        self.modalPresentationStyle = UIModalPresentationFormSheet;
        NSMutableArray *controllers = [NSMutableArray array];
        for (int i = 0; i< 15; i++) {
            UIViewController *vc = [[UIViewController alloc] init];
            UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
            vc.title = [NSString stringWithFormat:@"view %i", i];
            [controllers addObject:nav];
        }
        self.viewControllers = controllers;
    }
    return self;
}

我也尝试将modalPresentationStyle添加到moreNavigationController而不做任何更改。

2 个答案:

答案 0 :(得分:3)

美好的一天,dizy。

你做过的一个很好的挑战。这是一个解决方案,也许它有点硬核,但它有效。

我在你写的时候完成了 - 将UITabBarController子类化并将其呈现为模态视图控制器。并遇到同样的问题。当点击“更多”屏幕中的“编辑”按钮时,会出现UITabBarCustomizeView并且它的框架不合适。

所以我做了以下事情。我已将MyModalTabBarVC作为自己的委托并实施了tabBarController:willBeginCustomizingViewControllers:方法:

- (void)tabBarController:(UITabBarController *)tabBarController     
willBeginCustomizingViewControllers:(NSArray *)viewControllers
{
    UIView *modalView = self.view;
    CGRect bounds = modalView.bounds;

    UIView *customizationView   = [[modalView subviews] objectAtIndex:1];
    UIView *customizationNavBar = [[customizationView subviews] objectAtIndex:0];

    CGRect navBarFrame = [customizationNavBar frame];
    navBarFrame.size.width = bounds.size.width;
    customizationNavBar.frame = navBarFrame;
    customizationView.frame   = bounds;
}

因此,当调用此方法时,已创建UITabBarCustomizeView。并且可以手动更改错误的框架。如果您在开始时记录po [self.view subviews],您将获得:

(id) $1 = 0x06c6a940 <__NSArrayM 0x6c6a940>(
<UITransitionView: 0xd744ab0; frame = (0 0; 540 571); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0xd744b50>>,
<UITabBarCustomizeView: 0x6c5e570; frame = (0 -384; 768 1004); animations = { position=<CABasicAnimation: 0x6c569a0>; }; layer = <CALayer: 0x6c618d0>>,
<UITabBar: 0xd744110; frame = (0 571; 540 49); autoresize = W+TM; layer = <CALayer: 0xd742b80>>,
)

PS。此解决方案无法修复动画。正如您在日志中看到的那样,损坏的动画已经创建并收费。我希望取消它并添加一个合适的新版本不会成为问题。

答案 1 :(得分:0)

模态视图的viewController必须引起故障。

您可以尝试:

  1. 在编辑时隐藏标签栏,并在完成按钮时取消隐藏它 被压了。
  2. 为视图控制器创建自定义工具栏,这可以完成 使用UIView,以便它始终位于视图的顶部。
  3. 调整各个标签的大小。最好的方法是创建你的 自己的自定义标签栏,连接了UIViewController和IBActions 与IBOutlets的UIButtons。

  4. 为什么你在modalPresentationStyle中有这么多标签?我个人会改用push segue。

    尝试推送到他们自己的导航控制器下的一组新的视图控制器。标签栏会有更多空间。要返回,请在弹出推送的工具栏中放置一个后退按钮,或者将其推回到原始位置。