Показать субрегион UIView в UIScrollView - PullRequest
4 голосов
/ 17 марта 2010

В моем приложении у меня большая площадь (≈5000x5000pts), и я должен позволить пользователю видеть (+ масштабировать, прокручивать) только его определенный прямоугольный субрегион со сторонами, не обязательно параллельными сторонам области.

Каков наилучший способ сделать это?

Что я делаю сейчас:

  • Иметь большой UIView, содержащий всю область (таким образом, его кадр 5000x5000) в качестве подпредставления UIScrollView.
  • Рассчитать и применить CGAffineTransform - повернуть мой вид, чтобы стороны региона были параллельны координатной оси, а положение - необходимой области относительно начала координат:

    contentView.transform = CGAffineTransformMake(cos(angle), sin(angle), -sin(angle), cos(angle), -requiredRect.origin.x, -requiredRect.origin.y);
    
  • Установите размер содержимого scrollview на требуемое значение.

    scrollView.contentSize = CGSizeMake(someWidth, someHeight);
    

Это работает таким образом, но есть некоторые (не все перечисленные на самом деле) проблемы с ним:

  • Когда я масштабирую представление прокрутки, его размер содержимого сбрасывается до размера моего вида большой области (5000x5000, умноженное на коэффициент масштабирования). Я снова установил его в методе делегата scrollViewDidEndZooming, но в любом случае это выглядит странно.
  • Масштабирование, похоже, применяется с неверной точкой привязки и выглядит нехорошо (вид «прыгает» в другую позицию после завершения масштабирования)

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

1 Ответ

0 голосов
/ 22 марта 2010

Хотя я не полностью удовлетворен своим решением, я пришел к следующему: в методе делегата -scrollViewDidScroll я проверяю, является ли текущий видимый регион субрегионом моей ограниченной области.Если это не так, я корректирую смещение содержимого без анимации, чтобы сделать видимую область соответствующей ограничениям.

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView{
    if (!CGRectContainsRect(myLimitRect, [aScrollView visibleRect]){
         // calculate new contents offset to make visible region fit limits
         [aScrollView setContentOffset:newContentOffset animated:NO}; 
    }   
}

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

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