Отображение пользовательского интерфейса по центру на экране при уменьшении масштаба

#iphone #uiscrollview #uiimageview #zooming

#iPhone #uiscrollview #uiimageview #масштабирование #просмотр пользовательского интерфейса

Вопрос:

У меня есть UIImageView внутри UIScrollView. Я хочу, чтобы пользователь мог увеличивать изображение и перемещаться по нему.

Это мой рабочий код:

 //img is the UIImageView
//scroller is the UIScrollView

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return img; 
}
- (void)viewDidLoad {
   [super viewDidLoad];
   UIImage *image = [UIImage imageNamed:@"map_screen.png"];
   img = [[UIImageView alloc] initWithImage:image];
   scroller.delegate = self;
   scroller.autoresizesSubviews = YES;
   scroller.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
   scroller.contentSize = img.frame.size;
   scroller.scrollEnabled = YES;
   scroller.directionalLockEnabled = NO;
   scroller.userInteractionEnabled = YES;

   CGSize ivsize = img.frame.size;
   CGSize ssize = scroller.frame.size;

   float scalex = ssize.width / ivsize.width;
   float scaley = ssize.height / ivsize.height;
   scroller.minimumZoomScale = fmin(1.0, fmax(scaley, scalex));
   scroller.zoomScale = fmin(1.0, fmax(scalex, scaley));
   [scroller addSubview:img];
   img.userInteractionEnabled = YES;
}
  

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

Если я напишу

 scroller.minimumZoomScale = fmin(1.0, scalex);
  

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

я пробовал что-то подобное этому

 CGPoint scrollCenter = [scroller center];
[img setCenter:CGPointMake(scrollCenter.x, scrollCenter.y)];
  

или

 img.center = scroller.center;
  

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

Что я могу сделать, чтобы это исправить?

Ответ №1:

Вы должны сделать это вручную во время масштабирования, используя функцию делегирования scrollViewDidZoom … что-то вроде

 - (void)scrollViewDidZoom:(UIScrollView *)scrollView
{

    // center the image as it becomes smaller than the size of the screen
    CGSize boundsSize = scrollView.bounds.size;
    CGRect frameToCenter = imageView.frame;

    // center horizontally
    if (frameToCenter.size.width < boundsSize.width)
    {
        frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2;
    } else {
        frameToCenter.origin.x = 0;
    }

    // center vertically
    if (frameToCenter.size.height < boundsSize.height) 
    {
        frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2;
    } else {
        frameToCenter.origin.y = 0;
    }

    imageView.frame = frameToCenter;

}
  

Ответ №2:

Быстрая версия ответа Бастиана 3.0, немного более краткая:

 func scrollViewDidZoom(_ scrollView: UIScrollView) {
    // center the image as it becomes smaller than the size of the screen
    let boundsSize    = scrollView.bounds.size
    var frameToCenter = imageView.frame

    // center horizontally and vertically
    let widthDiff  = boundsSize.width  - frameToCenter.size.width
    let heightDiff = boundsSize.height - frameToCenter.size.height
    frameToCenter.origin.x = (widthDiff  > 0) ? widthDiff  / 2 : 0;
    frameToCenter.origin.y = (heightDiff > 0) ? heightDiff / 2 : 0;

    imageView.frame = frameToCenter;
}