Мне нелегко разбираться в этом.
У меня есть 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;
}
}
Но это не помогло слишком много (потому что я лениво загружаю представления, таким образом, не все они обязательно загружаются, когда это выполняется).
Там какой-либо путь состоит в том, чтобы решить эту проблему?
Я не совсем уверен, что правильно вас понял .. однако некоторые мысли:
Свойство кадра - это одно (A), а то, как отображается содержимое представления, - другое (В). CGRect кадра является (теоретической) границей вашего представления в супервизоре (родительском представлении) .. однако ваше представление не обязательно должно заполнять всю эту область кадра .
Относительно (A):
Здесь у нас есть свойство UIView autoresizingMask
, чтобы установить, как изменяется размер кадра при изменении размера супервизора. Что происходит, когда вы меняете ориентацию. Однако обычно вы можете полагаться на настройки по умолчанию (до сих пор у меня работало).
Что касается (B):
Как содержимое представления распределяется в кадре представления, определяется свойством UIView contentMode
. С помощью этого свойства вы можете установить, что соотношение сторон должно оставаться неизменным. Установите для него значение UIViewContentModeScaleAspectFit
, например, или что-то еще ..
PS: Я написал «теоретический», потому что содержимое вашего представления также может выходить за эти границы кадра - они только ограничивают view, когда для свойства clipsToBounds UIView установлено значение YES. Я считаю ошибкой то, что Apple по умолчанию установила НЕТ.
В дополнение к тому, что написал Эфраин, обратите внимание, что свойство фрейма НЕДЕЙСТВИТЕЛЬНО, если преобразование вида отличается от преобразования идентичности -- т.е. , когда вид повернут.
Конечно, вы учли тот факт, что ваши представления должны быть в новой позиции смещения, верно?