Найти центральную точку UIScrollView при масштабировании - PullRequest
3 голосов
/ 13 июля 2010

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

Подробности: Приложение запускается с мозаичным изображением 500x500.Если пользователь увеличит масштаб, он будет привязан к 1000x1000, и плитки будут перерисованы.Для всех эффектов увеличения и т. Д. Я просто позволяю UIScrollView делать свое дело.Когда вызывается scrollViewDidEndZooming:withView:atScale:, я перерисовываю тайлы (как вы можете видеть во многих примерах и других вопросах здесь).

I думаю , что я детализировал проблему до вычисленияцентр обзора правильно, когда я добираюсь до scrollViewDidEndZooming:withView:atScale: (после перерисовки я могу точно отцентрировать известную точку).

Что я сейчас использую:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    // as an example, create the "target" content size
    CGSize newZoomSize = CGSizeMake(1000, 1000);

    // get the center point
    CGPoint center = [scrollView contentOffset];
    center.x += [scrollView frame].width / 2;
    center.y += [scrollView frame].height / 2;

    // since pinch zoom changes the contentSize of the scroll view, translate this point to 
    // the "target" size (from the current size)
    center = [self translatePoint:center currentSize:[scrollView contentSize] newSize:newZoomSize];

    // redraw...
}

/*
    Translate the point from one size to another
*/
- (CGPoint)translatePoint:(CGPoint)origin currentSize:(CGSize)currentSize newSize:(CGSize)newSize {
    // shortcut if they are equal
    if(currentSize.width == newSize.width && currentSize.height == newSize.height){ return origin; }

    // translate
    origin.x = newSize.width * (origin.x / currentSize.width);
    origin.y = newSize.height * (origin.y / currentSize.height);
    return origin;
}

Делает ли этокажется правильным?Есть ли способ лучше?Спасибо!

Ответы [ 2 ]

1 голос
/ 14 июля 2010

Способ, который я до сих пор решил, - это сохранить начальную центральную точку вида при запуске масштабирования. Первоначально я сохранял это значение при вызове метода scrollViewDidScroll (и масштабирование прокрутки). Когда вызывается scrollViewDidEndZooming:withView:atScale:, я использую эту центральную точку (и сбрасываю сохраненное значение).

0 голосов
/ 25 июля 2013

Центр прокрутки можно найти, добавив его свойство center и свойство contentOffset.

 aView.center = CGPointMake(
     self.scrollView.center.x + self.scrollView.contentOffset.x,
     self.scrollView.center.y + self.scrollView.contentOffset.y);
...