我在调整 UITabBarController 大小时遇到一些问题,因为我只想让它占据屏幕的下半部分。它似乎强制自己显示屏幕的整个高度(如果显示则减去状态栏)。
我尝试过对其进行子类化并在方法上修改控制器的视图框架,例如viewWillAppear;
但这是行不通的。有时我可以强制改变它的位置,但是一旦选择另一个选项卡,或者如果另一个视图控制器以模态方式呈现在它前面,它就会调整大小回到全屏!
我尝试将 UIWindow (添加了选项卡栏控制器)设置为autoresizesSubviews:NO
和标签栏的autoresizingMask:UIViewAutoresizingNone
但这还不行!
任何帮助将不胜感激!
我对此进行了实验,并确定当发生以下任何情况时,tabBarController 将自动调整其视图大小并撤消所有更改:
- 所选 ViewController 的值发生变化;
- 界面方向改变;
- 选项卡栏被(重新)加载并放置在视图/窗口内。
通过注册所有上述事件,然后从中调用自定义调整大小方法,我能够强制 UITabBar 的视图保持恒定大小。
您可以使用 KVO 观察所选 ViewController 的变化,如下所示:
[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];
这应该确保每次触发标签栏几何形状变化时您都会得到提示。收到这些回调后,您可以从每个回调中调用您自己的自定义方法,并根据需要调整选项卡栏的大小,而无需对其进行子类化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)