我有一张显示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的左上角(附上屏幕截图供您参考)。
我通过Center content of UIScrollView when smaller(第三个答案)通过子类化UIScrollView找到了这个问题的解决方案,并在滚动视图的'layoutSubviews'方法中调整了图像视图框。缩小时工作正常。但是当我们缩放并滚动图像以查看边缘/侧面部分时,scrollview会将图像视图重新调整到中心,我无法在放大状态下看到图像的侧面部分。针对此问题的任何解决方法?
答案 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
}