插入UIImageView作为子视图滞后

时间:2011-12-24 19:15:24

标签: iphone ios uinavigationcontroller uiimageview uiimage

我有一个UIImageView,它包含一个非常大的图像(3 +/- MB),我插入它作为背景图像作为这样的子视图:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view insertSubview:imageView atIndex:0];
}

问题是当导航控制器推动视图时,转换不顺畅;它非常不稳定因为(我假设)图像很大并且将其加载到图像视图中是很昂贵的。我曾经使用

self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"foobar"]];

但由于图像太大,该代码放大了图片,它只显示了它的一小部分,而且非常接近。

有没有更好/更有效的方法来做这件事?

3 个答案:

答案 0 :(得分:1)

我要尝试的是:首先调整图像大小,使其达到界面实际大小。为此,请使用其UIGraphicsBeginImageContextWithOptions方法将图像重新绘制到图像上下文(drawInRect:)中。在我的书中有很多关于此的信息:http://www.apeth.com/iOSBook/ch15.html

例如,要将图像缩小到其大小的一半:

UIImage* lin = [UIImage imageNamed: @"lin.png"];
CGSize s = lin.size;
CGFloat scale = 0.5;
s.width *= scale; s.height *= scale;
UIGraphicsBeginImageContextWithOptions(s, YES, 0);
[lin drawInRect:(CGRect){{0,0}, s}];
lin = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

此外,效率低下的根源可能在其他地方。使用模拟器中的新调试菜单查找在界面中低效绘制的其他内容。有效的绘图有一个很好的WWDC 2011视频。动画正是这些低效率表现出来的地方,所以我认为你正走在正确的轨道上。

答案 1 :(得分:0)

要解决这个问题,“但是因为图像太大了,所以代码放大了图片,它只显示了它的一小部分,非常接近。”,你可以用setFrame方法设置UIImageView的框架像这样:

[yourImageView setFrame:CGRectMake(0,0,xWidth, yHeight)];

如果yourImageView位于viewcontroller的视图之上,则可以执行以下操作:

[yourViewController.yourImageView setFrame:CGRectMake(0,0,yourViewController.view.frame.size.width, yourViewController.view.frame.size.height)];

答案 2 :(得分:0)

最终对我有用的是在MainWindow.xib中创建一个UIImageView并将其设置为图像,这样每次视图更改时都不需要加载和卸载它,并提供流量app一些连续性。谢谢你的帮助!