UISplitViewController останавливает автоматическое вращение после попытки использовать UINavigationController внутри него - PullRequest
3 голосов
/ 28 декабря 2010

У меня возникли небольшие проблемы с UISplitViewController в моем приложении для iPad. Я пытаюсь создать простое дерево навигации с помощью UINavigationController внутри UISplitView. Я использовал следующий основной код для этого:

NavController.h

@interface NavController : NSObject {
    /* 
     * This is connected properly to the UINavigationController in the 
     * UISplitViewController through Interface Builder.
     */

    UINavigationController *navigationController;

 }

 @property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

 @end

NavController.m

#import "NavController.h"

@implementation NavController

@synthesize navigationController;

- (void) awakeFromNib {
    UIViewController *testController = [[UIViewController alloc] init];
    UITableView *tableView = [[UITableView alloc] init];

    [testController setView: tableView];

    [navigationController pushViewController: testViewController
                                    animated: YES];

}

@end

Этот код успешно передает представление на контроллер навигации, и я могу вернуться назад с помощью кнопки «назад», однако моя проблема возникает с тем фактом, что после этого мой UISplitViewController больше не вращается или вообще не поворачивается портретная позиция. Когда я удаляю этот код (и представление не выдвигается), он работает как положено.

Что я делаю не так, и правильно ли я поступаю?

1 Ответ

1 голос
/ 06 января 2011

Это тоже сводило меня с ума.Я сделал пару вещей, которые заставили его работать, но я не доволен своими решениями - 1) Я не очень понимаю это и 2) это кажется хакерским.

Я добавил это в свое приложениеделегат (мой файл .m):

@interface UITabBarController (MyApp)
@end

@interface UINavigationController (MyApp)
@end

@implementation UITabBarController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return YES;
}
@end

@implementation UINavigationController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return YES;
}
@end

Это работало по большей части.Для видов, которые не вращались автоматически, мне пришлось вручную поворачивать виды, используя преобразования.Я сделал что-то вроде:

- (void)deviceOrientationDidChangeWithAnimation:(BOOL)animated {
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

    if (orientation == oldOrientation) {
        return;
    }

    if (animated) {
        CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:duration];
        [UIView setAnimationDidStopSelector:@selector(orientationChanged)];
    }

    [self sizeToFitOrientation:YES];

    if (animated) {
        [UIView commitAnimations];
    }

    oldOrientation = orientation;
}

- (CGAffineTransform)transformForOrientation {
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if (orientation == UIInterfaceOrientationLandscapeLeft) {
        return CGAffineTransformMakeRotation(M_PI*1.5); // rotated CCW
    } else if (orientation == UIInterfaceOrientationLandscapeRight) { // CW
        return CGAffineTransformMakeRotation(M_PI/2);
    } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { // CCW
        return CGAffineTransformMakeRotation(-M_PI);
    } else { // CW
        return CGAffineTransformIdentity;
    }
}

- (void)sizeToFitOrientation:(BOOL)transform {
    if (transform) {
        self.view.transform = CGAffineTransformIdentity;
    }

    CGRect frame = [UIScreen mainScreen].applicationFrame;
    CGPoint center = CGPointMake(frame.origin.x + ceil(frame.size.width/2), frame.origin.y + ceil(frame.size.height/2));

    CGFloat width = frame.size.width - 0 * 2;
    CGFloat height = frame.size.height - 0 * 2;

    UIInterfaceOrientation _orientation = [UIApplication sharedApplication].statusBarOrientation;
    if (UIInterfaceOrientationIsLandscape(_orientation)) {
        self.view.frame = CGRectMake(0, 0, height, width);
    } else {
        self.view.frame = CGRectMake(0, 0, width, height);
    }
    self.view.center = center;

    if (transform) {
        self.view.transform = [self transformForOrientation];
    }
}

Надеюсь, это поможет!И если кто-то может указать на ошибки, которые я сделал (или на плохие вещи, которые я увековечиваю), я был бы счастлив узнать.:)

...