我正在开发一个从 UIImagePickerController 加载图像并将它们加载到 UIScrollview 中的应用程序。将图像加载到 ScrollView 中效果很好。但是,图像将以不同的比例加载(底部的代码,用于演示的图像)。应用程序加载的第一张图片可以正常加载,但第二张会被缩小得太小。两者都通过相同的代码块加载。
首先通过 UIImagePickerController 加载图像:
同一图像的第二次加载:
这是 loadImage 方法,它们都是通过该方法加载的:
-(void)loadImage:(UIImage *)image
{
imageView.image = image;
[imageScrollView setFrame: CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height)];
[imageScrollView setDelegate:self];
[imageScrollView setShowsHorizontalScrollIndicator:NO];
[imageScrollView setShowsVerticalScrollIndicator:NO];
[imageScrollView setMaximumZoomScale:2.0];
CGRect rect;
rect.size.width = imageView.image.size.width;
rect.size.height = imageView.image.size.height;
[imageView setFrame:rect];
[imageScrollView setContentSize:[imageView frame].size];
float minimumScale = [imageScrollView frame].size.width / [imageView frame].size.width;
[imageScrollView setMinimumZoomScale:minimumScale];
[imageScrollView setZoomScale:minimumScale];
}
尽管我花了 4-5 个小时来研究和寻找应该是一个简单问题的答案,但我还是被难住了。我自己的努力并没有改变什么,我也没有找到有人寻求帮助解决这个问题的例子。我需要在我的代码中更改什么,以便图像始终在第一时间正确显示 - 也就是说,它们显示为按比例显示,以便显示整个图像,或者(更好)图像以最小尺寸完全显示在屏幕上?
如有任何帮助,我们将不胜感激!
最佳答案
我认为您只需要 [self.imageScrollView setZoomScale:1.0f];
但您可能会遇到复合问题。
由于您已经花了一些时间尝试对此进行调试,所以让我提供一些可以帮助您确定问题的提示。我的第一个建议是回归基础。
1 - 确保您的 View 构建正确。如果您启用了自动布局;也许将其关闭以使事情变得 super 简单。您应该在其中包含 UIScrollView 和 UIImageView。
2 - 继续微小的步骤,将每个 View 的背景颜色设置为令人讨厌的颜色。查看=红色; ScrollView =绿色; ImageView = 蓝色。调整 ScrollView 的大小,使其小于您的 View ;并调整 ImageView 的大小,使其小于 ScrollView 。在您的 ImageView 上设置“剪辑 subview ”选项。
3 - 在 viewDidLoad 方法中设置更持久的属性。
- (void)viewDidLoad
{
[super viewDidLoad];
[self.scrollView setDelegate:self];
[self.scrollView setMinimumZoomScale:0.5f];
[self.scrollView setMaximumZoomScale:2.5f];
[self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
4 - 注释掉除将 imageView 设置为图像的行之外的所有 loadImage 代码。试验 imageView 的内容模式设置如何改变 View 的行为。请注意,如果您设置 self.imageView.contentMode = UIViewContentModeScaleAspectFit;
将调整图像大小以适应 imageView,而不改变其比例。但是,如果将模式设置为 topLeft;它会将 View 调整为图像的大小!
还要考虑 ScrollView 的工作方式。您希望 ScrollView 的框架保持与在界面生成器中制作的大小相同。如果它必须显示的“内容”大于 ScrollView 的框架,则 ScrollView 将滚动。您可以拥有一个小图像,只需将 ScrollView 的内容高度设置为较大的值,即可在您的 ScrollView 中滚动它。如果您将 imageView 框架的大小调整为大于 ScrollView 的框架;您可能也想调整 ScrollView 的内容区域。但是从你的描述来看,我不认为那是你在做什么。
5 - 当您取回图像时,只需将其粘贴到 ImageView 中即可。设置 zoomScale = 1.0 以防您在上一张图像上缩放。将内容偏移量设置为 0,0 以防您滚动...
- (void)imagePickerController:(UIImagePickerController *) picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSLog(@"Picked: %@", info);
[self dismissModalViewControllerAnimated:YES];
UIImage * image = [info objectForKey:UIImagePickerControllerOriginalImage];
[self.imageView setImage:image];
// You want to resize the image to fit inside our view, not fit view to image, right?
//[self.imageView setFrame:CGRectMake(0, 0, image.size.width, image.size.height)];
//[self.scrollView setContentSize:image.size];
[self.scrollView setZoomScale:1.0f];
[self.scrollView setContentOffset:CGPointZero];
}
根据您的描述,以上内容应该对您有用。很抱歉,如果有太多细节,但我认为添加一些提示/技术来可视化事物可能会有所帮助。
更新 我应该澄清一下......你的代码有效,但 View 的大小正在被 scrollView 缩放;这会打乱你的计算。在 loadImage 的顶部设置 zoomScale=1.0,其余的应该按您的预期工作。也就是说,您可以根据您想要的行为进一步改进。
--d
关于iphone - 加载到 UIScrollview 中的图像尺寸错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13100884/