Смещение содержимого UIScrollView блокирует взаимодействие с пользователем

#iphone #objective-c #xcode #ipad #uiscrollview

#iPhone #objective-c #xcode #iPad #uiscrollview

Вопрос:

Я создаю приложение, которое содержит вид прокрутки с некоторыми подвидами, созданными на пользовательских интерфейсах…

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

Вот как я изложил свое мнение:

UIView -> UIScrollView -> UIView -> UIImageView -> Вложенные просмотры с распознавателями жестов.

первый UIView — это просто представление UIViewControllers, UIScrollView — это то, что будет / должно обрабатывать разницу в ориентации, второй UIView — это просто контейнер, который предотвращает неправильное позиционирование, а UIImageView содержит мое изображение. что такое диаграмма, на которой я разместил ряд пользовательских флажков и меток в / над UIImageViewдля отображения содержимого и получения и обработки взаимодействия…

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

Я могу исправить это, запустив этот код в didRotateFromInterfaceOrientation: функции:

 int offset = 0;
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) 
    offset = 128;
else 
    offset = 0;
[scrollView setContentInset:UIEdgeInsetsMake(offset, 0, -offset, 0)];
  

Приведенный выше код просто изменяет свойства contentInset top и bottom, чтобы настроить положение на 128 пикселей в каждую сторону … затем в режиме прокрутки содержимое будет отображаться нормально…

Однако, когда я пытаюсь коснуться любого из жестов в пределах 128 пикселей снизу, они не будут работать! Я так много пытался заставить его работать, но если я не изменю contentInset, они все равно не будут работать (в пределах 128 снизу)… Это действительно сбивает меня с толку, поскольку для всех моих просмотров для параметра userInteractionEnabled установлено значение YES, но оно по-прежнему не будет работать, все остальное будет, и содержимое будет отображаться нормально в этой области 128 пикселей…

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

Спасибо за чтение,

Лиам

Ответ №1:

Я понял это в конце… Это была проблема с изменением размера кадра… все, что мне нужно было сделать, это запустить этот код для функции didRotate:

 int offset = 0;
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
    [scrollView setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    offset = 128;
} else { 
    [scrollView setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    offset = 0;
}
[scrollView setContentInset:UIEdgeInsetsMake(offset, 0, -offset, 0)];
  

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