2010-07-11 4 views
7

У меня очень простой пример UIScrollView, который просто не делает то, что он должен. Не уверен, что это ошибка с API или ошибка в моем коде.UIScrollView не получает новый размер при изменении ориентации

В принципе, у меня есть UIViewController с UIScrollView, так как он находится на виду. Когда я добавляю его в UIWindow и меняю ориентацию iPad, я выхожу из формата UIScrollView s, который указан неверно (?).

Вот мой UIViewController реализация:

@implementation CustomViewController 
- (void)loadView { 
    scrollView = [[[UIScrollView alloc] init] autorelease]; 
    scrollView.delegate = self; 
    scrollView.backgroundColor = [UIColor redColor]; 
    self.view = scrollView; 
} 

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    CGSize rect = scrollView.frame.size; 
    NSLog(@"will rotate w%f h%f", rect.width, rect.height); 
} 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    CGSize rect = scrollView.frame.size; 
    NSLog(@"will animate rotation w%f h%f", rect.width, rect.height); 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    CGSize rect = scrollView.frame.size; 
    NSLog(@"did rotate w%f h%f", rect.width, rect.height); 
} 

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

@end 

Когда я запускаю приведенный выше код, я вижу следующие записи в моей консоли:

2010-07-11 11:03:05.214 Untitled2[6682:207] will rotate w768.000000 h1004.000000 
2010-07-11 11:03:05.214 Untitled2[6682:207] will animate rotation w748.000000 h1024.000000 
2010-07-11 11:03:05.619 Untitled2[6682:207] did rotate w748.000000 h1024.000000 
2010-07-11 11:03:07.951 Untitled2[6682:207] will rotate w748.000000 h1024.000000 
2010-07-11 11:03:07.958 Untitled2[6682:207] will animate rotation w768.000000 h1004.000000 
2010-07-11 11:03:08.367 Untitled2[6682:207] did rotate w768.000000 h1004.000000 

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

Есть ли способ получить UIScrollView, чтобы сообщить о его реальном размере?

ответ

3

У меня есть ответ, если вы все еще ищете. Проверьте границы , а не рамку.

Причина: frame - производное свойство границ и преобразование, применяемое для вращения.

+0

Это не работает. Я перехватываю изменения, затем я использую NSStringFromRect (self.bounds), и он печатает границы «непосредственно перед изменением». Но текущая начальная ориентация возвращает правильное значение. По крайней мере, один из них последовательно возвращает то же самое, но человек ... эта проблема не должна занять много времени. Из документов, в то время как границы являются неотрицательными, не всегда ли это 0,0, то же, что и ширина рамки, такая же, как высота кадра? –

+0

Порог границ всегда равен 0,0 по умолчанию, если вы не меняете часть просмотра, которую хотите отобразить. Thats только половина истории, CGRect содержит член размера тоже, и это то, что обычно изменяется при изменении размера, переориентации представления. Функции «will» выше дают вам «before values», функции «did» дают вам «after values». –

2

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

scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
+0

К сожалению, после добавления изменения размера маски я все еще получаю недопустимые размеры возвращающимися. Визуально все в порядке, но я не могу полагаться на размеры рамки. Я взломал его, обнаружив ориентацию устройств и перелистывая ширину и высоту, когда пейзаж - это не идеально, но он работает. – d2kagw

+0

Вам нужно проверить ориентацию [[UIDevice currentDevice]] и посмотреть следующее: UIDeviceOrienationIsPortrait() или аналогично тестировать его. Рамка будет неправильной, но она сообщит о правильной ориентации. Это раздражает, я имею дело с этим прямо сейчас, но рад, что что-то твердое. Возможно, ответ на границы поможет мне авторизовать мой UIScrollView, но мой оффкильтер даже после ручной смены математики на соответствие ориентации –

1

Я заметил, что определение в didRotateFromInterfaceOrientation новый contentSize также невозможно, если вы начинаете с файлом iPhone СИБ вместо выделенного файла IPad СИБ: кадры в файле iPhone СИБ будут гораздо меньше и, следовательно, расчетная высота контента становится намного больше, чем должна быть, когда вы на самом деле на iPad. Apple DID говорит, что я ДОЛЖЕН создать отдельный файл NIB для iPad ...

Итак, я также получаю старые измерения в didRotateFromInterfaceOrientation, но для меня это теперь не проблема, так как iOS обрабатывает все ОК, как только я начните с нужного файла NIB. Тем не менее, мне кажется менее интуитивным то, что в методе didRotateFromInterfaceOrientation размеры кадра неверны для текущего вида.

PS. Я нашел решение в конце, просто используйте уведомления вместо didRotateFromInterfaceOrientation.

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(orientationChanged:) 
               name:UIDeviceOrientationDidChangeNotification 
               object:nil]; 

Затем в методе orientationChanged, настроить вид на новые кадры. У меня была одна последняя проблема: если начальная ориентация отличалась от ориентации в nib, представление все равно было бы неправильным, я решил, что создав новый файл NIB, особенно для пейзажного представления. В методе init метод ViewController выбирает, какой NIB он загружает, исходя из текущей ориентации.

0

Обычно я устанавливаю это, устанавливая одно значение contentSize на 0, как CGSizeMake(contentSize.width, 0) для горизонтального просмотра.

Чтобы заставить UIScrollView прокрутить только, например. горизонтальное значение для прокрутки contentSize до 0>CGSizeMake(contentSize.width, 0).

Надеюсь, это поможет.

0

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

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
self.view = scrollView; 
CGSize rect = scrollView.frame.size; 
NSLog(@"will rotate w%f h%f", rect.width, rect.height); 
} 

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
self.view = scrollView;  
CGSize rect = scrollView.frame.size; 
NSLog(@"will animate rotation w%f h%f", rect.width, rect.height); 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
self.view = scrollView; 
CGSize rect = scrollView.frame.size; 
NSLog(@"did rotate w%f h%f", rect.width, rect.height); 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
return YES; 
} 
Смежные вопросы