трогает начался после didRotateFromInterfaceOrientation - PullRequest
0 голосов
/ 01 июля 2011

Я заметил, что после изменения ориентации из портретной в альбомную, я больше не получаю события touchchesBegan для некоторых частей моего обзора. Я полагаю, что это потому, что я не информирую свой UIView об изменении размера рамки моего окна после поворота устройства.

Я настраиваю все программно (UIWindow, UIViewController, UIView) следующим образом:

myViewController = [[myUIViewController alloc] init];
myWindow = [[UIWindow alloc] initWithFrame: rect];
myView = [[myUIView alloc] initWithFrame: [myWindow bounds]];

[myViewController setView:myView];
[myWindow addSubview:myView];
[myWindow setFrame:rect];
[myWindow makeKeyAndVisible];

Когда я получаю уведомление didRotateFromInterfaceOrientation, я обновляю фрейм окна следующим образом:

[[[self view] window] setFrame:rect];

Но после этого мой UIView больше не получает события touchesXXX для всех областей. Кажется, что только области предыдущего кадра все еще сообщают о событиях. Итак, мой вопрос: есть ли что-то еще, что мне нужно сделать в didRotateFromInterfaceOrientation, чтобы проинформировать мой UIView об изменении измерения?

Спасибо за помощь!

РЕДАКТИРОВАТЬ: я должен изменить положение UIView на didRotateFromInterfaceOrientation (), или это делается автоматически? Я заметил, что свойство transform моего UIView установлено в матрицу преобразования при изменении ориентации. Однако из-за этого очень трудно изменить мою точку зрения. В документах говорится, что свойство frame нельзя использовать, когда преобразование активно, поэтому я попытался изменить свойство center, чтобы изменить положение моего представления, но это также не работает правильно. Я хочу переместить вид в верхний левый угол, поэтому я установил «center» на (screenwidth / 2, screenheight / 2), но он не позиционирует вид правильно :( Любая идея или информация, что нужно сделать, чтобы получить события прямо в режиме ориентации?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2012

ОК. Я знаю, что это старый вопрос, но именно так я и решил эту проблему.

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

Мое приложение всегда отображает строку состояния, кроме случаев, когда я показываю это представление.

Чтобы все это работало, преобразования должны были применяться в методе viewWillAppearдля одного.Сначала у меня был следующий код в методе viewDidAppear, и я думаю, что он перепутался с границами для события touchesBegan.

Вот код viewWillAppear:

- (void)viewWillAppear:(BOOL)animated
{
    // Hide the status bar
    [[UIApplication sharedApplication] setStatusBarHidden:YES];

    // This is to offset the frame so that the view will take the fullscreen once the status bar is hidden
    self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -20.0);

    // If view is to be displayed in landscape mode
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"orientation"])
    {
        // Change status bar orientation
        [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft];

        // Turn the view 90 degrees
        [self.navigationController.view setTransform:CGAffineTransformMakeRotation(M_PI/2)];

        // Set the frame and the bounds for the view
        // Please Note: Frame size has to be reversed for some reason.
        [self.navigationController.view setFrame: CGRectMake(0,0,320,480)];
        [self.navigationController.view setBounds: CGRectMake(0,0,480,320)];

        // Make sure user can interact with view
        [self.navigationController.view setUserInteractionEnabled:YES];
    }
}

Любая другая вещь, которая должна быласлучиться с макетом, должно произойти в методе viewDidAppear.Например, у меня было изображение, которое покрывало весь вид, и рамка должна была быть установлена ​​в зависимости от ориентации.Установка фрейма в viewWillAppear дала странные результаты, но тот же код прекрасно работал в viewDidAppear.

Надеюсь, это кому-нибудь поможет, когда я в течение 6 часов ударился об эту вещь.

0 голосов
/ 02 июля 2011

У меня была такая же проблема, и я считаю, что это проблема с фреймом.

Я должен был вручную установить rects в зависимости от ориентации, а также установить userInteractionEnabled на главном экране, например:

if (appOrientation == 0)
    appOrientation = [UIApplication sharedApplication].statusBarOrientation;
if (appOrientation == UIInterfaceOrientationLandscapeLeft || appOrientation == UIInterfaceOrientationLandscapeRight) {

    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    myView.frame = CGRectMake(0, 0, 1024, 768);

} else {

    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    myView.frame = CGRectMake(0, 0, 768, 1024);
}

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