Поддержка авторотации для подпрограммы, загруженной программно - iPad - PullRequest
2 голосов
/ 11 мая 2011

У меня есть проект iPad, структурированный как: - AppDelegate - MainWindow - View Controller - View

.m. Файл View Controllers .m загружает другое представление программно и размещает его на экране.Это представление будет вставлено и выдвинуто.

Я делаю это:

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect  viewRect = CGRectMake(0, 0, 0, 0);
    CalculatorView *v = [[[CalculatorView alloc] 
                                    initWithFrame:viewRect] autorelease];
    [self.view.window addSubview:v];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    v.view.frame   = CGRectMake(0, 0, 460, 320);
    [UIView commitAnimations];
}

Проблема, с которой я сталкиваюсь, заключается в том, что добавляемое здесь подпредставление, похоже, не имеетправильная ориентация.Проект поддерживает ТОЛЬКО ландшафт и запускает в ландшафт.Контейнерный вид в порядке, и он содержит несколько кнопок, которые также хороши.Однако этот программно загруженный вид застрял в портретном режиме.Я предоставил следующий код автоматического поворота (в загруженном представлении .m):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

Но он никогда не вызывается.

Итак, как я могу получить программно добавленное представление длязагрузить в альбомной, а не в портретном режиме?ТИА!

1 Ответ

1 голос
/ 11 мая 2011

Класс UIView не получает сообщения об изменении ориентации.

(особенно метод shouldAutorotateToInterfaceOrientation, который является методом UIViewController)

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW23

Вы должны будете вручную добавить метод в своем представлении, чтобы сообщить ему, что ориентация изменилась, и вы должны вызвать этот метод в вашем контроллере shouldAutorotateToInterfaceOrientation метод.

Для этого вам нужно будет создать ссылку на ваше представление в вашем контроллере и позаботиться о памяти самостоятельно.

@interface MyController : UIViewController {

   CalculatorView *_calculatorView;

}

@end

@implementation MyController


- (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect  viewRect = CGRectMake(0, 0, 0, 0);

   //inits _calculatorView without the autorelease. Will be released in the dealloc method
    _calculatorView = [[CalculatorView alloc] 
                                    initWithFrame:viewRect];
    [self.view.window addSubview:v];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    _calculatorView.view.frame   = CGRectMake(0, 0, 460, 320);
    [UIView commitAnimations];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
   //calls custom interface orientation method
   [_calculatorView MyInterfaceChangedCustomMethod:interfaceOrientation];

    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

-(void) dealloc { 

   [_calculatorView release];
   [super dealloc];
}



@end

РЕДАКТИРОВАТЬ: Если ваш CalculatorView прост, и все, что вам нужно, это правильно изменить его кадр после поворота устройства, я думаю, что лучший подход будет использовать маску autoresizing вашего представления, как показано ниже

_calculatorView = [[CalculatorView alloc] 
                                    initWithFrame:viewRect];
_calculatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
...