2010-03-17 6 views
4

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

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

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

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

    contentView.transform = CGAffineTransformMake(cos(angle), sin(angle), -sin(angle), cos(angle), -requiredRect.origin.x, -requiredRect.origin.y); 
    
  • Set Scrollview, чтобы требуемое значение.

    scrollView.contentSize = CGSizeMake(someWidth, someHeight); 
    

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

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

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

ответ

0

Хотя я не полностью удовлетворен своим решением, я пришел к следующему: в методе делегата -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 может справиться с этим очень хорошо ,

Смежные вопросы