1

我正在开发一个从 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 个小时来寻找应该是一个简单问题的答案,但我还是被难住了。我自己的努力并没有改变任何东西,我还没有找到有人为这个问题寻求帮助的例子。我需要在我的代码中进行什么更改,以便图像始终在第一次正确显示 - 也就是说,它们显示为缩放以便显示整个图像,或者(更好)图像以最小尺寸完全显示在屏幕上?

任何帮助将不胜感激!

4

1 回答 1

1

我认为您只需要这样做,[self.imageScrollView setZoomScale:1.0f];但您可能会遇到复杂的问题。

由于您已经花了一些时间尝试调试此问题,因此让我介绍一些可以帮助您识别问题的提示。我的第一个建议是回归基础。

1 - 确保您的视图构造正确。如果您启用了自动布局;也许将其关闭以使事情变得超级简单。你应该有你的 UIScrollView 和一个 UIImageView 在里面。

2 - 继续小步骤,将每个视图的背景颜色设置为令人讨厌的颜色。视图=红色;滚动视图=绿色;图像视图 = 蓝色。调整滚动视图的大小,使其比您的视图小;并调整图像视图的大小,使其小于您的滚动视图。在您的图像视图上设置“剪辑子视图”选项。

3 - 在 vi​​ewDidLoad 方法中设置更重要的属性。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.scrollView setDelegate:self];
    [self.scrollView setMinimumZoomScale:0.5f];
    [self.scrollView setMaximumZoomScale:2.5f];
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}

4 - 注释掉所有 loadImage 代码,除了将 imageView 设置为图像的行。试验一下 imageView 的内容模式设置如何改变视图的行为。请注意,如果您设置self.imageView.contentMode = UIViewContentModeScaleAspectFit;将调整图像大小以适应 imageView 内部,而不改变其比例。但是,如果将模式设置为 topLeft;它会将视图的大小调整为图像的大小!

还要考虑滚动视图是如何工作的。您希望滚动视图的框架保持与您在界面构建器中制作的大小相同。如果它必须显示的“内容”大于滚动视图的框架,则滚动视图将滚动。您可以拥有一个小图像,只需将滚动视图的内容高度设置为较大的值,即可在滚动视图中滚动它。如果您将 imageView 框架的大小调整为更大,那么您的滚动视图的框架;您可能也想调整滚动视图的内容区域。但是从你的描述来看,我觉得你不是这个意思。

5 - 当您恢复图像时,只需将其粘贴在图像视图中即可。设置 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];
}

根据您的描述,上述内容应该适合您。抱歉,如果有太多细节,但我认为添加一些提示/技术来可视化事物可能会有所帮助。

更新 我应该澄清......您的代码有效,但视图的大小正在由滚动视图缩放;这会影响您的计算。在您的 loadImage 顶部设置 zoomScale=1.0,其余部分应按您的预期工作。也就是说,您可以根据您想要的行为对事物进行更多改进。

--d

于 2012-10-27T17:45:46.660 回答