IOS 中方向更改后包含 UIImageView 的 UIScrollView 的布局不正确

Posted

技术标签:

【中文标题】IOS 中方向更改后包含 UIImageView 的 UIScrollView 的布局不正确【英文标题】:Layout incorrect for UIScrollView that holds a UIImageView after orientation changes in IOS 【发布时间】:2014-01-13 11:19:45 【问题描述】:

我设置了一个UIScrollView,其中包含一个UIImageView 和一个UIImage。我加载到图像视图中的 UIImage 大小约为 2300x1200,并且没有按比例缩小,因为可以缩放。

UIScrollView 包含一个 UIImageView,它设置为允许点击/双击来放大和缩小图像。我有followed a tutorial here to create this。

示例的源代码可以是downloaded here.。

问题 我遇到的问题是方向的改变。视图不再按预期布局和偏移。

下载图片后(在我的示例中),我完成以下操作:

[self.mainImageView setImage:image];
self.mainImageView.frame = (CGRect).origin=CGPointMake(0.0f, 0.0f), .size=image.size;

// Tell the scroll view the size of the contents
self.mainScrollView.contentSize = image.size;

[self setupScales];

然后我设置Scales如下:

// Set up the minimum & maximum zoom scales
CGRect scrollViewFrame = self.mainScrollView.frame;
CGFloat scaleWidth = scrollViewFrame.size.width / self.mainScrollView.contentSize.width;
CGFloat scaleHeight = scrollViewFrame.size.height / self.mainScrollView.contentSize.height;
CGFloat minScale = MIN(scaleWidth, scaleHeight);

self.mainScrollView.minimumZoomScale = minScale;
self.mainScrollView.maximumZoomScale = 1.0f;
self.mainScrollView.zoomScale = minScale;

[self centerScrollViewContents];

我然后centerScrollViewContents如下:

CGSize boundsSize = self.mainScrollView.bounds.size;
CGRect contentsFrame = self.mainImageView.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.mainImageView.frame = contentsFrame;

scrollView 和 imageView 设置如下:

self.mainScrollView.translatesAutoresizingMaskIntoConstraints = NO;
self.mainImageView.translatesAutoresizingMaskIntoConstraints = NO;

scrollView 对 left/right/top/bottom 的约束固定为 0,而 imageView 没有手动创建的约束。我曾尝试在willRotateToInterfaceOrientation 中运行self.mainScrollView needsUpdateConstraints,但这并没有什么不同。

在选择第一个选项“图像缩放”时可以在上面的示例应用程序中复制相同的问题,然后更改设备的方向。我不确定什么是不正确的,看起来框架设置不正确。我曾尝试在不同点运行 setupScales,但这似乎并没有改变问题。

【问题讨论】:

【参考方案1】:

看起来scrollView的contentSize在frame改变时被重置了。旋转完成后,我必须将其设置回图像大小。

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
    // When the orientation is changed the contentSize is reset when the frame changes. Setting this back to the relevant image size
    self.mainScrollView.contentSize = self.mainImageView.image.size;
    // Reset the scales depending on the change of values
    [self setupScales];

我已经为将来需要它的任何人设置了一个 repo - https://github.com/StuartMorris0/SPMZoomableUIImageView

【讨论】:

以上是关于IOS 中方向更改后包含 UIImageView 的 UIScrollView 的布局不正确的主要内容,如果未能解决你的问题,请参考以下文章

iOS ViewController 在方向更改后无法正确布局

更改设备方向时如何为uiimageview设置动画

在iOS中移动后试图找到UIImageView的新中心点

MKMapView 区域在 iOS7 中方向更改后损坏

我如何在 Swift iOS 中检测 UIImageView 中的更改图像

方向更改后iOS Maps UIPopover错位