UIView在Scrollview缩放问题中

时间:2014-12-23 10:22:50

标签: ios iphone uiscrollview uiimageview zooming

我有一张显示iOS应用程序的照片,用户应该可以在其中查看和缩放图像。根据要求,图像应显示在整个scree中(不应显示透明部分,图像应填满整个屏幕),因此我自己使用AspectFill模式UIImageView。为了实现缩放功能,使用了UIScrollView并实施了viewForZoomingInScrollView UIScrollView委托方法。图像视图连接到StoryBoard中滚动视图的四个边缘,两个约束(imageHeight和imageWidth)连接到IBOutlet。这些约束将在ViewControllers viewDidLayoutSubviews方法中更新。

我已添加以下代码供您参考。

- (void)setImageViewModes {
     self.scrollView.minimumZoomScale = CALCULATD_ZOOM_SCALE;
     self.pageImageView.contentMode = UIViewContentModeScaleAspectFill;
}

pragma mark - UIScrollView Delegate

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {

    return MY_IMAGE_VIEW;
}

- (void)updateImageViewConstraints {

    self.imageHeight.constant = CGRectGetHeight(self.scrollView.frame);
    self.imageWidth.constant = CGRectGetWidth(self.scrollView.frame);
    [self.view layoutIfNeeded];
}

然而,当我尝试缩小图像时,它会反弹到其初始状态,并且图像的外部被剪裁(它仅显示图像的初始填充部分)。是否有任何可用的解决方法可以在缩小时查看整个图像?

我试过为UIScrollView设置最小缩放比例(我的代码中有一个方法来计算图像的最小缩放比例)并且缩放功能有效。但是,当我们缩小时,UIIMage总是移动到scrollview的左上角(附上屏幕截图供您参考)。enter image description here

我通过Center content of UIScrollView when smaller(第三个答案)通过子类化UIScrollView找到了这个问题的解决方案,并在滚动视图的'layoutSubviews'方法中调整了图像视图框。缩小时工作正常。但是当我们缩放并滚动图像以查看边缘/侧面部分时,scrollview会将图像视图重新调整到中心,我无法在放大状态下看到图像的侧面部分。针对此问题的任何解决方法?

2 个答案:

答案 0 :(得分:1)

使用此

-(void)scrollViewDidZoom:(UIScrollView *)scrollView1{
[self centerScrollViewContent];

}

- (void)centerScrollViewContent {
CGSize boundsSize = self.scrollView.bounds.size;
CGRect contentsFrame = self.drawingView.frame;

if (contentsFrame.size.width < boundsSize.width) {
    contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0f;
} else {
    contentsFrame.origin.x = 0.0f;
}

if (contentsFrame.size.height < boundsSize.height) {
    contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0f;
} else {
    contentsFrame.origin.y = 0.0f;
}
self.drawingView.frame = contentsFrame;

}

答案 1 :(得分:0)

Swift 3版Rahul's code

func scrollViewDidZoom(_ scrollView: UIScrollView) {
    centerContentView()
}

func centerContentView() {
    let boundsSize = scrollView.bounds.size
    var contentFrame = contentView.frame

    if contentFrame.size.width < boundsSize.width {
        contentFrame.origin.x = (boundsSize.width - contentFrame.size.width) / 2.0
    } else {
        contentFrame.origin.x = 0.0
    }
    if contentFrame.size.height < boundsSize.height {
        contentFrame.origin.y = (boundsSize.height - contentFrame.size.height) / 2.0
    } else {
        contentFrame.origin.y = 0.0
    }

    contentView.frame = contentFrame
}