Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 加载到UIScrollview的图像大小不正确_Iphone_Objective C_Ios - Fatal编程技术网

Iphone 加载到UIScrollview的图像大小不正确

Iphone 加载到UIScrollview的图像大小不正确,iphone,objective-c,ios,Iphone,Objective C,Ios,我正在开发一个从UIImagePickerController加载图像并将其加载到UIScrollview的应用程序。将图像加载到ScrollView工作正常。但是,图像将以不同的比例加载(底部的代码,要演示的图像)。应用程序加载的第一个图像将很好地加载,但第二个图像将缩小得太小。两者都是通过相同的代码块加载的 通过UIImagePickerController首次加载图像: 第二次加载相同的图像: 这是loadImage方法,它们都是通过以下方式加载的: -(void)loadImage:

我正在开发一个从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-确保您的视图构造正确。如果已启用自动布局;也许关掉它让事情变得超级简单。您应该在其中包含UIScrollView和UIImageView

2-继续小步骤,将每个视图的背景色设置为令人讨厌的颜色。视图=红色;滚动视图=绿色;图像视图=蓝色。调整滚动视图的大小,使其比视图小;并调整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-注释掉所有loadImage代码,将imageView设置为图像的行除外。尝试imageView的内容模式设置如何更改视图的行为。请注意,如果设置self.imageView.contentMode=UIViewContentModeScaleAspectFit将调整图像大小以适应imageView,而不更改其比例。但是,如果将模式设置为左上角;它会将视图调整为图像的大小

也考虑ScLoVIEW如何工作。您希望滚动视图的框架保持与在interface builder中创建的框架相同的大小。如果必须显示的“内容”大于scrollview的框架,scrollview将滚动。您可以拥有一个小图像,只需将scrollview的内容高度设置为较大值,即可在scrollview中滚动图像。如果将imageView框架的大小调整为大于scrollview的框架;您可能还需要调整scrollview的内容区域。但从你的描述来看,我不认为你在做什么

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];
}
根据您所描述的,以上内容应该适用于您。抱歉,如果有太多的细节,但我认为添加一些提示/技术来可视化事情可能会有所帮助

更新 我应该澄清一下。。。您的代码可以工作,但视图的大小由scrollView缩放;这会打乱你的计算。在loadImage的顶部设置zoomScale=1.0,其余部分应按预期工作。也就是说,你可以根据你想要的行为来改进一些东西


--d

我认为您只需要
[self.imageScrollView setZoomScale:1.0f]但您可能存在复合问题

既然您已经花了一些时间尝试调试这个问题,那么让我来介绍一些可能有助于您确定问题的提示。我的第一个建议是回到基础

1-确保您的视图构造正确。如果已启用自动布局;也许关掉它让事情变得超级简单。您应该在其中包含UIScrollView和UIImageView

2-继续小步骤,将每个视图的背景色设置为令人讨厌的颜色。视图=红色;滚动视图=绿色;图像视图=蓝色。调整滚动视图的大小,使其比视图小;并调整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-注释掉所有loadImage代码,将imageView设置为图像的行除外。尝试imageView的内容模式设置如何更改视图的行为。请注意,如果设置self.imageView.contentMode=UIViewContentModeScaleAspectFit将调整图像大小以适应imageView,而不更改其比例。但是,如果将模式设置为左上角;它会将视图调整为图像的大小

也考虑ScLoVIEW如何工作。您希望滚动视图的框架保持与在interface builder中创建的框架相同的大小。如果必须显示的“内容”大于scrollview的框架,scrollview将滚动。您可以拥有一个小图像,只需将scrollview的内容高度设置为较大值,即可在scrollview中滚动图像。如果将imageView框架的大小调整为大于scrollview的框架;您可能还需要调整scrollview的内容区域。但从你的描述来看,我不认为你在做什么

5-当你得到你的图像后,只需将其粘贴在图像视图中即可。如果在上一幅图像上进行缩放,请将zoomScale设置为1.0。将“内容偏移”设置为0,0(如果您是s)