Как я могу использовать scrollRectToVisible для прокрутки к центру изображения? - PullRequest
7 голосов
/ 06 февраля 2010

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

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

Спасибо!

Ответы [ 4 ]

16 голосов
/ 06 октября 2011

Вот, возможно, немного лучший код на случай, если кому-то понадобится; -)

UIScrollView + CenteredScroll.h:

@interface UIScrollView (CenteredScroll)

-(void)scrollRectToVisibleCenteredOn:(CGRect)visibleRect
                            animated:(BOOL)animated;

@end

UIScrollView + CenteredScroll.m:

@implementation UIScrollView (CenteredScroll)

-(void)scrollRectToVisibleCenteredOn:(CGRect)visibleRect
                            animated:(BOOL)animated
{
  CGRect centeredRect = CGRectMake(visibleRect.origin.x + visibleRect.size.width/2.0 - self.frame.size.width/2.0,
                                   visibleRect.origin.y + visibleRect.size.height/2.0 - self.frame.size.height/2.0,
                                   self.frame.size.width,
                                   self.frame.size.height);
  [self scrollRectToVisible:centeredRect
                   animated:animated];
}

@end
7 голосов
/ 07 марта 2013

Основываясь на ответе Дэниела Бьюка, я обновил его код, добавив масштаб увеличения:

@implementation UIScrollView (jsCenteredScroll)

-(void)jsScrollRectToVisibleCenteredOn:(CGRect)visibleRect
                            animated:(BOOL)animated
{

    CGPoint center = visibleRect.origin;
    center.x += visibleRect.size.width/2;
    center.y += visibleRect.size.height/2;

    center.x *= self.zoomScale;
    center.y *= self.zoomScale;


    CGRect centeredRect = CGRectMake(center.x - self.frame.size.width/2.0,
                                     center.y - self.frame.size.height/2.0,
                                     self.frame.size.width,
                                     self.frame.size.height);
    [self scrollRectToVisible:centeredRect
                     animated:animated];
}

@end
2 голосов
/ 05 января 2016
private func centerScrollContent() {
    let x = (imageView.image!.size.width * scrollView.zoomScale / 2) - ((scrollView.bounds.width) / 2)
    let y = (imageView.image!.size.height * scrollView.zoomScale / 2) - ((scrollView.bounds.height) / 2)
    scrollView.contentOffset = CGPointMake(x, y)
}
0 голосов
/ 06 февраля 2010

Хорошо, все заработало. Вот код, если кому-то нужно:

CGFloat tempy = imageView.frame.size.height;
CGFloat tempx = imageView.frame.size.width;
CGRect zoomRect = CGRectMake((tempx/2)-160, (tempy/2)-240, myScrollView.frame.size.width, myScrollView.frame.size.height);
[myScrollView scrollRectToVisible:zoomRect animated:YES];
...