具有大量元素的自定义 segued 视图缓慢

Posted

技术标签:

【中文标题】具有大量元素的自定义 segued 视图缓慢【英文标题】:Custom segued view with lots of elements slow 【发布时间】:2016-03-23 10:37:24 【问题描述】:

当我在 iPad 3 上触发我的 CatalogController 时(在模拟器中需要不到一秒钟,但这不相关):

- (IBAction)goToCatalog:(id)sender 
    NSLog(@"goToCatalogPre");
    [self presentViewController:[[UIStoryboard storyboardWithName:@"Main_iPad" bundle:nil] instantiateViewControllerWithIdentifier:@"CatalogController"] animated:YES completion:nil];
    NSLog(@"goToCatalogPost");

我得到这个结果:

2016-03-23 11:27:07.245 Fashion App[592:78778] goToCatalogPre
2016-03-23 11:27:13.571 Fashion App[592:78778] goToCatalogPost

所以这是一个粗略的 6.25 秒。我从头到尾测试了 viewDidLoad,实际上只需要几纳秒。除了该调用之外,没有其他任何触发。

我将这些委托附加到我的 ViewController:

@interface CatalogController : CoreController <UICollectionViewDelegate, UICollectionViewDataSource, UISearchBarDelegate, UIPickerViewDelegate, UIPickerViewDataSource>

CoreController 只跟踪一个变量,因此不会出现缓慢。

任何人都有任何可能导致此异常的经验?老实说,我可以解构所有元素以追溯它,但我想知道是否有人以前遇到过这种情况以及可能导致它的原因,或者除了viewDidLoad 调用之外,我还能在哪里追踪它。

以下是我的故事板中关于此视图的元素:

【问题讨论】:

您是否尝试将 stg 记录到 UIViewController 的 awakeFromNib 方法中?我个人用很多 UI 元素实现了界面,而且我从来没有遇到过像描述的那样的延迟问题。如果您没有在主踏板上执行任何超长操作,您可以尝试从父视图中删除 UI 元素块(以编程方式),然后检查延迟是否真的改变,可能是由于特定的 UI 元素跨度> CatalogController 上的 awakeFromNib 在记录 goToCatalogPre 后的 11 毫秒内响应。我想这真的归结为将其分解为元素毕竟是的。感谢您的提示:) 你可以尝试展示几乎所有隐藏子视图的新 VC(字面意思是 setHidden:YES,或直接从 storyboard 中),然后用一种淡入效果展示它们( setAlpha:0;setHidden :NO;animation.. ) 以特定的淡入顺序呈现它们,因此您可以在 UI 效果中更改问题 ;) 当然,如果这会使一切变得更流畅并会消除延迟 我尝试将所有内容都设置为隐藏作为测试,它并没有改变加载时间的一小部分。看起来代表们正在做一些奇怪的事情。编辑:即使删除代表也不会改变任何事情:(。太尴尬了..也没有后台进程在运行。 【参考方案1】:

我使用了时间探查器,它确实发生在引擎盖下。在某些时候,它会碰到一个 UIButton(占总运行时间的 69%),然后再深入到 TBaseFont:CopyLocalizedName(__CFString const*) 并从那里分成 33% 和 22%(以及一些剩余部分)到一些本地化缓存和 TBaseFont::CopyNativeFont() 常量。我想我必须检查所有按钮,看看哪个按钮会导致这种情况。

经过一些跟踪,我发现(通过这个答案:Xib taking long time (>1s) to load. UIFont cache seems to blame)这是一个旧的缺失字体错误。它尝试加载 Lucida Grande 的旧变体,但它似乎以某种方式停止了缓存,使其变得异常。将字体更正为 System 再次修复它。即时加载时间仅为几毫秒。

【讨论】:

以上是关于具有大量元素的自定义 segued 视图缓慢的主要内容,如果未能解决你的问题,请参考以下文章

具有单独移动背景的自定义 segue

不使用 Storyboard segues 的自定义视图转换 (Swift)

带有完成块和属性的自定义 segue 转换

Swift:嵌入在导航控制器中的视图之间的自定义segue

在另一个视图控制器展开 segue 后重新加载 UIView 数据上的自定义 tableview

IOS / Objective-C / Storyboard:从左到右的自定义Segue在视图控制器之间创建黑条