UIScrollView с включенными страницами и изменения вращения/ориентации устройства (БЕЗУМИЕ)

Мне нелегко разбираться в этом.

У меня есть UIScrollView с включенной подкачкой страниц. Этим управляет контроллер представления (MainViewController), и каждой страницей управляет PageViewController, его представление, добавленное как подпредставление scrollView при надлежащем смещении. Прокрутка лево-правильная для стандартного приложения для iPhone ориентации. Работы хорошо. В основном точно как образец, обеспеченный Apple и также как Погодное приложение, предоставлен iPhone.

Однако, когда я пытаюсь поддерживать другие ориентации, вещи не работают очень хорошо. Я поддерживал каждую ориентацию и в MainViewController и в PageViewController с этим методом:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return YES;
}

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

Я сказал моим представлениям поддерживать автоизменение размеров с

 theView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

Но напрасно. Это, кажется, просто расширяет и искажает мои представления.

В моем MainViewController я добавил эту строку в попытке изменить размер представлений всех моих страниц:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * ([self.viewControllers count]), self.scrollView.frame.size.height);

    for (int i = 0; i < [self.viewControllers count]; i++) {
        PageViewController *controller = [self.viewControllers objectAtIndex:i];
        if ((NSNull *)controller == [NSNull null])
            continue;

        NSLog(@"Changing frame: %d", i);
        CGRect frame = self.scrollView.frame;
        frame.origin.x = frame.size.width * i;
        frame.origin.y = 0;
        controller.view.frame = frame;
    }
}

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

Там какой-либо путь состоит в том, чтобы решить эту проблему?

18
задан jbrennan 16 December 2010 в 05:55
поделиться

2 ответа

Я не совсем уверен, что правильно вас понял .. однако некоторые мысли:

Свойство кадра - это одно (A), а то, как отображается содержимое представления, - другое (В). CGRect кадра является (теоретической) границей вашего представления в супервизоре (родительском представлении) .. однако ваше представление не обязательно должно заполнять всю эту область кадра .

Относительно (A): Здесь у нас есть свойство UIView autoresizingMask , чтобы установить, как изменяется размер кадра при изменении размера супервизора. Что происходит, когда вы меняете ориентацию. Однако обычно вы можете полагаться на настройки по умолчанию (до сих пор у меня работало).

Что касается (B): Как содержимое представления распределяется в кадре представления, определяется свойством UIView contentMode . С помощью этого свойства вы можете установить, что соотношение сторон должно оставаться неизменным. Установите для него значение UIViewContentModeScaleAspectFit , например, или что-то еще ..

см. Здесь: http://developer.apple.com/iphone/library/documentation/UIKit/ Ссылка / UIView_Class / UIView / UIView.html # // apple_ref / doc / uid / TP40006816-CH3-SW99

PS: Я написал «теоретический», потому что содержимое вашего представления также может выходить за эти границы кадра - они только ограничивают view, когда для свойства clipsToBounds UIView установлено значение YES. Я считаю ошибкой то, что Apple по умолчанию установила НЕТ.

1
ответ дан 30 November 2019 в 09:40
поделиться

В дополнение к тому, что написал Эфраин, обратите внимание, что свойство фрейма НЕДЕЙСТВИТЕЛЬНО, если преобразование вида отличается от преобразования идентичности -- т.е. , когда вид повернут.

Конечно, вы учли тот факт, что ваши представления должны быть в новой позиции смещения, верно?

1
ответ дан 30 November 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: