插入 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 在 vi​​ewcontroller 的视图之上,你可以这样做:

[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

iOS:禁用子视图的自动旋转

在作为子视图添加的滚动视图中将触摸事件传递给 uiimageview

如果将 UIButton 作为子视图添加到 UIImageView,则单击 UIButton 不起作用

UIImageView 作为我的 UIViewController 类中 UIView 的子视图

MapView 的 UIImageView 子视图