加载到UIScrollview中的图像显示的大小错误

时间:2012-10-27 14:06:55

标签: iphone objective-c ios

我正在开发一个应用程序,它从UIImagePickerController加载图像并将它们加载到UIScrollview中。将图像加载到ScrollView中可以正常工作。但是,图像将以不同的比例加载(底部的代码,要显示的图像)。应用程序加载的第一个图像将加载正常,但第二个图像将按比例缩小。两者都通过相同的代码块加载。

通过UIImagePickerController首次加载图像:

full sized image

第二次加载相同图片:

image loaded but doesnt fill view

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

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

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

由于您已经花了一些时间尝试调试它,让我提供一些可以帮助您确定问题的提示。我的第一个建议是回归基础。

1 - 确保您的观点构建正确。如果您启用了autolayout;也许把它关掉以保持超级简单。您应该在其中包含UIScrollView和UIImageView。

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

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的内容模式设置如何改变视图的行为。请注意,如果设置self.imageView.contentMode = UIViewContentModeScaleAspectFit;,则会调整图像大小以适合imageView,而不会更改其比例。但是,如果将模式设置为topLeft;它会将视图调整为图像的大小!

还要考虑scrollviews的工作原理。您希望scrollview的框架保持与在界面构建器中创建的框架相同的大小。如果必须显示的“内容”大于滚动视图的框架,则滚动视图将滚动。您可以拥有一个小图像,只需将scrollview的内容高度设置为大,即可在滚动视图中滚动它。如果您将imageView框架的大小调整为大于滚动视图的框架;你可能也想调整scrollview的内容区域。但是根据你的描述,我认为这不是你想要的。

5 - 当您恢复图像时,只需将其粘贴在图像视图中即可。设置zoomScale = 1.0,以防您在prev图像上进行缩放。如果您在滚动时将内容偏移设置为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];
}

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

<强>更新 我应该澄清......你的代码是有效的,但是视图的大小是由scrollView缩放的;这会抛弃你的计算。在loadImage的顶部设置zoomScale = 1.0,其余的应该按照您的意图工作。也就是说,你可以根据你的行为来改进一些东西。

- d