UITabBarController - 初始帧和调整大小
Posted
技术标签:
【中文标题】UITabBarController - 初始帧和调整大小【英文标题】:UITabBarController - Initial Frame and Resizing 【发布时间】:2011-03-08 04:05:45 【问题描述】:我发现了这个:Subclass UITabBarController to adjust its frame,它解释了如何实现我在答案中的目标。为了解释那里的帖子,您必须注册以在 TabBarController 的选定视图更改时收到通知,然后在那里应用您的几何图形。否则它会被 TabBarController 吹走。
我正在尝试调整我的 UITabBarController 的大小以在某些任务发生时显示 20 像素高的状态消息。奇怪的是,如果我单步执行调整 TabBarController 大小的方法,框架的原点就会改变。
当视图首次出现时,UITabBarController 的 y 原点设置为 0。即使 applicatioinScreen y.origin 为 20。如果我在应用程序首次加载时调整大小,一切都会关闭。子视图不会调整大小。在第一次调整大小之后,如果我查看不同的选项卡,TabBarController 会自行调整到适当的大小,随后对我的调整大小方法的调用会确认这一点。
这就是我安装 UITabBarcontroller 的方式:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
UITabBarController *tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[AppController getGroupViewControllerArray] animated:NO];
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
return YES;
这就是我调整 TabBarController 大小的方式:
-(void)resizeTabToShowActivity
CGRect newFrame = mainTabBarController.view.frame;
CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
newFrame.origin.y = applicationFrame.origin.y + 20;
newFrame.size.height = applicationFrame.size.height - 20;
mainTabBarController.view.frame = newFrame;
我注意到,如果我在窗口中安装 TabBarController 后直接调整大小,一切正常。出于调试目的,我也将 resize 方法移到了 AppDelegate 中,但仍然没有乐趣。
谢谢
【问题讨论】:
在这个帖子的答案中找到了解决方案:***.com/questions/1815059/… 【参考方案1】:我能够通过将 UITabBarController 包含在父 UIViewController 中来调整其大小,并将父 UIViewController 作为应用程序的根视图控制器。
这是我的父 UIViewController
// .h file
@interface MyTabBarViewController : UIViewController <UITabBarControllerDelegate>
@property(nonatomic, strong) IBOutlet UITabBarController *tbc;
@end
// .m file
@implementation MyTabBarViewController
@synthesize tbc=_tbc;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
if (_tbc == nil)
CGRect frame = [[UIScreen mainScreen] bounds];
// arbitrary numbers, just to illustrate the point
CGRect smallFrame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width-300, frame.size.height-100);
_tbc = [[UITabBarController alloc] init];
_tbc.viewControllers = @[[[MyTabBarViewController1 alloc] init], [[MyTabBarViewController2 alloc] init]];
//_tbc.view.backgroundColor = [UIColor blueColor];
_tbc.view.autoresizesSubviews = YES;
_tbc.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_tbc.view.frame = smallFrame;
[self.view addSubview:_tbc.view];
MyViewController1 和 MyViewController2 只是具有 UILabel 的通用 UIViewController 子类。
这是加载父 UIViewController 的应用委托代码
@implementation MyTabBarAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
MyTabBarViewController *vc = [[MyTabBarViewController alloc] init];
vc.view.backgroundColor = [UIColor yellowColor];
vc.definesPresentationContext = NO;
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
return YES;
【讨论】:
手动将标签栏的(或任何控制器的)视图添加到视图中并不是一个好主意。控制器不会自动保留/释放,也不会收到普通的视图控制器通知(如旋转事件)。【参考方案2】:UITabBarController 通常从wantsFullScreenLayout
返回 YES,这意味着当用作根视图控制器时,它的视图将被调整为全屏大小,包括状态栏下方的区域。然后,控制器会根据需要调整其子视图的大小以避开状态栏下方的区域。
您可以尝试将 wantsFullScreenLayout
设置为 NO,这应该使其大小不会像您期望的那样位于状态栏下方。
【讨论】:
感谢您的快速回复,但这不是诀窍。我有一个 TabBarController 作为 rootviewcontroller(我尝试将它添加为子视图,并将其添加为 rootviewcontroller)。这些选项卡是使用三个自定义 UIViewController 类创建的,这些类由通用 UINavigationController 类包装。我正在设置 WantsFullScreenLayout = NO,但 TabBarController 仍在抓取全屏。【参考方案3】:在 UITabBarController 子类上试试这个:
- (void)viewDidLoad
[super viewDidLoad];
// A UITabBarController's view has two subviews: the UITabBar and a container UITransitionView that is
// used to hold the child views. Save a reference to the container.
for (UIView *view in self.view.subviews)
if (![view isKindOfClass:[UITabBar class]])
[view setFrame:RESIZED_FRAME];
【讨论】:
我会的,谢谢。抱歉回复晚了,直到今天我才看到这个。以上是关于UITabBarController - 初始帧和调整大小的主要内容,如果未能解决你的问题,请参考以下文章
如何在用户选择时在 uitabbarcontroller 内的 uinavigationcontroller 中每次都初始化 viewcontroller
iOS开发UI篇—UITabBarController简单介绍
UITabbarController 以编程方式更改栏项目标题