我在调整UITabBarController的大小时遇到了一些问题,因为我只想让它占据屏幕的下半部分。它似乎强制自己显示屏幕的整个高度(如果显示则减去状态栏)。
我已经尝试了对它进行子类化并在viewWillAppear;
等方法上修改控制器的视图框架,但它只是不起作用。在某些情况下,我可以强制改变它的位置,但是一旦选择了另一个选项卡,或者如果另一个视图控制器以模态方式呈现在它前面,它会调整回全屏!
我已经尝试将UIWindow(添加了标签栏控制器)设置为autoresizesSubviews:NO
和标签栏的autoresizingMask:UIViewAutoresizingNone
,但是没有这样做!
非常感谢任何帮助!
答案 0 :(得分:4)
我已经对此进行了实验,并确定tabBarController将自动调整其视图大小并在发生以下任何情况时撤消所有更改:
通过注册所有上述事件然后从中调用自定义调整大小的方法,我能够强制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];
这应该确保每次触发标签栏几何图形的变化时都会抬头。一旦您收到这些回调,您可以从每个回调中调用自己的自定义方法,并根据需要调整标签栏的大小,而无需将其子类化。