UINavigation 过渡口吃

Posted

技术标签:

【中文标题】UINavigation 过渡口吃【英文标题】:UINavigation Transition Stuttering 【发布时间】:2013-01-04 03:38:59 【问题描述】:

我有一个UIImagePickerController,它允许用户拍照,然后我将其存储在UIImageView 中,如下所示:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

    [self dismissModalViewControllerAnimated:YES];
    self.photoImageView.image = nil;
    [self.activityIndicatorView startAnimating];

    dispatch_async(dispatch_get_global_queue(0, 0), ^
    
        UIImage *image = [[info objectForKey:@"UIImagePickerControllerOriginalImage"] retain];
        dispatch_async(dispatch_get_main_queue(), ^
        
            self.photoImageView.image = image;
            [self.activityIndicatorView stopAnimating];
            self.rightButton.enabled = YES;
            [image release];
        );

    );

当我将此图像作为参数传递给下一个被推送到导航堆栈上的UIViewController 时,UINavigation 过渡会卡顿,并且非常不稳定/丑陋。我已经完成了一个配置文件,我的代码中没有任何东西真正突出。

我知道用相机拍摄的照片可能很大,但如果我只是传递对它的引用,那为什么会对任何东西产生影响?我的照片库中有我拍摄的照片,当我从那里选择它们并将它们传递到下一个过渡时,一切都很顺利。

有人知道是什么原因造成的吗?

【问题讨论】:

【参考方案1】:

可能是因为调整大小的过程发生在新 UIViewController 被推送到导航堆栈时。

假设从 iPhone 4 相机拍摄的照片的分辨率为 2592 x 1936 (http://***.com/questions/3270202/what-is-resolution-of-photo-taken-by-iphone-4-camera )。您的 UIImageView 的大小为 400 x 300px,然后调整大小的过程将在 viewWillAppear 中进行,这可能会使您的过渡卡顿。

有几种解决方法:

    在viewDidAppear中显示图片,只需保留对图片的引用,在viewDidAppear中设置为imageView.image即可。

    在显示之前先调整图片大小,比如 640 x 960。

【讨论】:

谢谢,你知道我刚刚发现了这个:wiresareobsolete.com/wordpress/2010/08/uiimagepickercontroller,它准确地描述了你所说的调整大小。我的问题是,我可以调用哪些代码来确定调整图像大小的正确大小?它应该只是纵向屏幕边界(*2,如果有视网膜?) 要调整大小的正确大小取决于 UIImageView 大小本身和您想要的纵横比(纵横比适合、纵横比填充等)。我建议使用 640 * 960,因为这是屏幕的视网膜分辨率(但不适用于 iPhone 5),并希望它足够小以使过渡卡顿消失。如果您想将调整大小的版本保存到相机胶卷库(将显示全屏照片),该分辨率也适用。 对我来说,我在 imageView 中缩放该图像,所以我猜屏幕尺寸会做到这一点。您介意将该链接放在#2 的答案中吗? 这是一篇很好的博文,解释了如何在 ios 中调整图像大小,vocaro.com/trevor/blog/2009/10/12/…,希望对您有所帮助

以上是关于UINavigation 过渡口吃的主要内容,如果未能解决你的问题,请参考以下文章

如何防止黑色背景出现在我的UINavigationBar中?

停止 AUGraph 的口吃

口吃和音轨开始播放多次

Java 游戏循环口吃

带有 AVAudioConverterInputBlock 的 AVAudioConverter 处理后音频口吃

Java KeyListener 口吃