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

UITabBarController

iOS开发UI篇—UITabBarController简单介绍

UITabbarController 以编程方式更改栏项目标题

UINavigationController  和 UITabBarController

iOS边练边学--UITabBarController的简单使用