Когда использовать layoutSubview в iOS - PullRequest
5 голосов
/ 05 августа 2011

Я пишу приложение для iOS для iPad, для которого требуется пользовательский макет.

Макет из портретной и альбомной ориентации полностью отличается, поэтому его невозможно решить с помощью UIAutoResizingMask.

Я пытаюсьиспользовать метод layoutSubview, но я обнаружил, что подпредставление макета называется много (из UIScrollView).Как я могу уменьшить вызов layoutSubview для оптимизации кода, или я должен вызывать его самостоятельно, когда устройство поворачивается.

Спасибо.

Ответы [ 4 ]

4 голосов
/ 05 августа 2011

Для различного ландшафтного и портретного дизайна используйте методы контроллеров вида, такие как

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation;
-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;

Если вы создаете свой пользовательский вид в зависимости от текущей ориентации, проверьте эту ориентацию с помощью UIDeviceOrientationDidChangeNotification уведомления и напишите соответствующий код.

в одном из init~ методов:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangedOrientation:) name:UIDeviceOrientationDidChangeNotification object:nil];

И действие

- (void) didChangedOrientation:(NSNotification *)sender{
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if (UIDeviceOrientationIsPortrait(orientation)){}}
3 голосов
/ 05 августа 2011

Тот факт, что layoutSubviews вызывается ребенком UIScrollView, очень прискорбен, но есть (уродливый) обходной путь:

@interface MyClass : UIView {
    BOOL reallyNeedsLayout_;
}
@end

@implementation MyClass

- (void)setNeedsLayout
{
    [super setNeedLayout];
    reallyNeedsLayout_ = YES;
}

- (void)setFrame:(CGRect)rect
{
    [super setFrame:rect];
    reallyNeedsLayout_ = YES;
}

- (void)layoutSubviews
{
    if (!reallyNeedsLayout_) return;
    reallyNeedsLayout_ = NO;

    // Do layouting.
}
@end

Не лучшее решение, но, кажется, работает достаточно хорошо.

1 голос
/ 29 октября 2014

Не стоит делать дорогие вычисления в layoutSubviews:

0 голосов
/ 05 августа 2011

Исходя из опыта, я бы лично настраивал ваш макет на основе уведомлений deviceDidRotateSelector. У меня есть метод updatePortrait, метод updateLandscape и вызов того, что необходимо.

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