UITabBarController - начальный кадр и изменение размера - PullRequest
3 голосов
/ 08 марта 2011

Я нашел это: Подкласс UITabBarController для настройки своего кадра , который объясняет, как добиться того, к чему я стремился, в ответе.Чтобы перефразировать сообщение там, вы должны зарегистрироваться, чтобы получать уведомления об изменении выбранного представления TabBarController, а затем применять свою геометрию там.В противном случае он уносится TabBarController.


Я пытаюсь изменить размер своего UITabBarController, чтобы при появлении определенных задач отображалось сообщение с высоким статусом 20 пикселей.Любопытно, что если я перейду к методу, который изменяет размер TabBarController, происхождение фрейма изменится.

Когда вид появляется в первый раз, у источника UITabBarController устанавливается на 0. Даже если applicationatioinScreen 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 в окне все работает отлично.В целях отладки я также переместил метод изменения размера в AppDelegate, но до сих пор не радуюсь.

Спасибо

Ответы [ 3 ]

1 голос
/ 22 октября 2012

Мне удалось изменить размер 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 - это просто общие подклассы UIViewController с UILabel.

Вот мой код делегата приложения, который загружает родительский 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;
}
0 голосов
/ 27 сентября 2011

Попробуйте это на подклассе 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];

        }
    }
}
0 голосов
/ 08 марта 2011

UITabBarController обычно возвращает YES из wantsFullScreenLayout, что означает, что его представление при использовании в качестве корневого контроллера представления будет иметь размеры для полного экрана, включая область под строкой состояния.Затем контроллер при необходимости изменяет размеры своих подпредставлений, чтобы избежать области под строкой состояния.

Вы можете попробовать установить wantsFullScreenLayout в значение NO, что должно привести к тому, что его размер будет не соответствовать строке состояния, как вам кажетсяожидать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...