插入 UIImageView 作为子视图滞后
Posted
技术标签:
【中文标题】插入 UIImageView 作为子视图滞后【英文标题】:Inserting UIImageView as subview lag 【发布时间】:2011-12-24 19:15:24 【问题描述】:我有一个 UIImageView,其中包含一个非常大的图像 (3 +/- MB),我将其插入以用作背景图像作为子视图,如下所示:
- (void)viewDidLoad
[super viewDidLoad];
[self.view insertSubview:imageView atIndex:0];
问题是当视图被导航控制器推送时,过渡不平滑;它非常不稳定,因为(我假设)图像很大并且将其加载到图像视图中很昂贵。我以前用过
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"foobar"]];
但是因为图片太大,那段代码把图片放大了,只显示了很小的一部分,而且非常近。
有没有更好/更有效的方法来做这件事?
【问题讨论】:
【参考方案1】:我要尝试的是:首先调整图像的大小,使其成为界面中实际的大小。为此,请使用其 drawInRect:
方法将图像重绘到图像上下文 (UIGraphicsBeginImageContextWithOptions
) 中。我的书中有很多关于这方面的信息: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();
此外,效率低下的根源可能在其他地方。使用模拟器中的新 Debug 菜单来查找在您的界面中低效绘制的其他内容。有一个很好的 WWDC 2011 视频有效地绘图。动画正是这些低效率表现出来的地方,所以我认为你在正确的轨道上。
【讨论】:
我知道 imageView 是问题所在,因为注释掉[self.view insertSubview:imageView atIndex:0]
行可以消除滞后。
图像,也许 - 不是 imageView。 UIImageView 是一种非常有效的图像绘制方式;不需要其他方式,这正是 UIImageView 的用途。
我正在阅读你书中关于图形上下文的章节,但我很迷茫。如何使用 UIGraphicsBeginImageContextWithOptions 来缩放图像?【参考方案2】:
要解决这个“但是因为图像太大,那段代码放大了图片,它只显示了很小的一部分,而且非常接近。”,您可以使用 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)];
【讨论】:
【参考方案3】:最后对我有用的是在 MainWindow.xib 中创建一个 UIImageView 并将其设置为图像,这样就不必在每次视图更改时加载和卸载它,并提供应用一些连续性。感谢您的帮助!
【讨论】:
以上是关于插入 UIImageView 作为子视图滞后的主要内容,如果未能解决你的问题,请参考以下文章
如何让 UIImageView 尊重它的 superview.layer.mask
在作为子视图添加的滚动视图中将触摸事件传递给 uiimageview
如果将 UIButton 作为子视图添加到 UIImageView,则单击 UIButton 不起作用