在缩小时在屏幕上居中显示UIImageView

问题描述:

我在UIScrollView中有一个UIImageView。我希望用户可以缩放和导航图像。在缩小时在屏幕上居中显示UIImageView

这是我的工作代码:

//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; 

,但这种解决方案,图像不完全地滚动,如果我缩小,它在顶部再次入住的屏幕,但不完全可见!

我该如何解决它?

你必须做手工,而变焦是在使用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; 

} 
+0

对!有用!谢谢!!! – JAA 2011-04-29 16:25:36

迅速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; 
}