子类UITabBarController调整其框架

时间:2009-11-29 08:56:42

标签: iphone cocoa-touch

我在调整UITabBarController的大小时遇到​​了一些问题,因为我只想让它占据屏幕的下半部分。它似乎强制自己显示屏幕的整个高度(如果显示则减去状态栏)。

我已经尝试了对它进行子类化并在viewWillAppear;等方法上修改控制器的视图框架,但它只是不起作用。在某些情况下,我可以强制改变它的位置,但是一旦选择了另一个选项卡,或者如果另一个视图控制器以模态方式呈现在它前面,它会调整回全屏!

我已经尝试将UIWindow(添加了标签栏控制器)设置为autoresizesSubviews:NO和标签栏的autoresizingMask:UIViewAutoresizingNone,但是没有这样做!

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

我已经对此进行了实验,并确定tabBarController将自动调整其视图大小并在发生以下任何情况时撤消所有更改:

  • selectedViewController的值更改;
  • 界面方向更改;
  • 标签栏被(重新)加载并放置在视图/窗口内。

通过注册所有上述事件然后从中调用自定义调整大小的方法,我能够强制UITabBar的视图保持不变大小。

您可以观察使用KVO对selectedViewController的更改,如下所示:

[tabBarController addObserver:self forKeyPath:@"selectedViewController" options:NSKeyValueObservingOptionNew context:NULL]

观察界面方向的变化可能有点棘手。如果您是从应用程序委托或其他专用于此目的的对象执行此操作,则可能无法获得针对交换方向更改的标准UIViewController回调。有两种方法可以解决此问题:(1)UIDevice和通知,以及(2)让您的一个视图控制器生成回调。就个人而言,我会推荐后者,因为UIDevice通知往往与界面不同步几微秒,结果看起来很麻烦。简化实施:

// In a header somewhere (Prefix.pch works).

extern NSString *const kOrinetationNotification;
extern NSString *const kOrinetationNotificationOrientationKey;

// in an instance of UIViewController

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
  [[NSNotificationCenter defaultCenter] postNotificationName:kOrientationNotification object:self userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:toInterfaceOrientation] forKey:kOrientationNotificationOrientationKey]];
  // do other stuff
}

// in your application delegate's (or other dedicated object) init method

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChange:) name:kOrientationNotification object:nil];

这应该确保每次触发标签栏几何图形的变化时都会抬头。一旦您收到这些回调,您可以从每个回调中调用自己的自定义方法,并根据需要调整标签栏的大小,而无需将其子类化。