Переопределение layoutSubviews при вращении UIView - PullRequest
3 голосов
/ 29 октября 2010

При вращении вида прокрутки внутри UIView вид прокрутки не позиционируется правильно, используя его поведение авторазмера по умолчанию.

Таким образом, когда происходит вращение, в willRotateToInterfaceOrientation я вызываю [self.view setNeedsLayout];, и мой layoutSubviews метод выглядит следующим образом:

- (void)layoutSubviews {
    NSLog(@"here in layoutSubviews");
}

Но ставим точку останова на метод, и онкажется, никогда не вводит метод.

Нужно ли что-то еще делать, чтобы заставить его работать?

Спасибо.

Ответы [ 5 ]

3 голосов
/ 29 октября 2010

willRotateToInterfaceOrientation вызывается до изменения ориентации, следовательно, ваш UIView по-прежнему будет иметь старый размер.Попробуйте вместо этого использовать didRotateFromInterfaceOrientation.

Кроме того, для дополнительного эффекта я бы скрыл scrollView (возможно, с внутренним блоком UIAnimation) в willRotateToInterfaceOrientation, изменил его размер и затем показал бы его в didRotateFromInterfaceOrientation (снова, возможно, внутри блока анимации).

Вот фрагмент из одного из моих приложений:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3f];
self.myScroll.hidden = YES;
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView commitAnimations];
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3f];
self.myScroll.hidden = NO;
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView commitAnimations];
}

Вы можете даже сделать причудливые вещи, проверив новую ориентацию, используя UIInterfaceOrientationIsPortrait (ориентация) или UIInterfaceOrientationIsLandscape (ориентация).

2 голосов
/ 14 марта 2012

Вызов [someScrollView setNeedsLayout] может на самом деле ничего не делать, если вид не был изменен или перемещен.Как вы говорите, этот метод никогда не вызывается с использованием поведения авторазмера по умолчанию, поскольку поведение по умолчанию вообще не изменяет размер.Скорее всего, вам нужно установить someScrollView.autoresizingMask.Когда интерфейс вращается, представление изменится, и будет вызван layoutSubviews.

0 голосов
/ 07 февраля 2016

Вы должны переопределить willAnimate ... и установить новый кадр вашего представления. Layoutsubviews должен вызываться автоматически во время вращения.

0 голосов
/ 23 февраля 2012

Метод не вызывается, потому что ViewController не имеет метода layoutSubviews.

Когда вы вызываете [self.view setNeedsLayout];, он просто вызывает метод layoutSubviews представления контроллера представления:[self.view layoutSubviews].

Вам нужно будет создать подкласс UIScrollview, чтобы сделать эту работу.

0 голосов
/ 29 января 2012

На самом деле, вы, вероятно, хотите переопределить контроллер представления willAnimateRotationToInterfaceOrientation: duration: метод (вырезано из моего примера):

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
                                        duration:(NSTimeInterval)duration {
    if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {
        boardView.frame = CGRectMake(0, 0, 320, 320);
        buttonsView.frame = CGRectMake(0, 320, 320, 140);
    } else {
        boardView.frame = CGRectMake(0, 0, 300, 300);
        buttonsView.frame = CGRectMake(300, 0, 180, 300);        
    }

}

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