2012-01-05 22 views
3

我很想看到有关如何以编程方式管理视图的详细说明。我将提供我现在如何做的一个概述,并希望对我的方法如何吸引评论,或只是如何干净利落地做一个概述。以编程方式添加和删除视图及其控制器的最佳方式是什么?

基本上,在我的应用程序的主视图控制器的loadView方法中,我首先创建一个根视图并将它设置为self.view。当我要附加控制器,也就是说,显示的第一个,我把这种方法:

-(void) attachViewForController:(UIViewController*)controller 
{ 
    [self.mRootView addSubview:controller.view]; 
    [controller viewWillAppear:NO];  
} 

请注意,我明确地调用viewWillAppear(我相信这不是自动调用它),在那里我手动执行任何将视图带入(滑入,淡入等)的动画。这种方法有什么不对或奇怪的地方吗?

现在,当我要离开这个观点并切换至另一个,我称之为设置的方法开关:

-(void) setControllerSwitch:(UIViewController*)outgoingController 
    incomingController:(UIViewController*)incomingController 
    delay:(float)delay; 
{ 
    self.mOutgoingController = outgoingController; 
    self.mIncomingController = incomingController; 
    self.mSwitchControllerTimer = [NSTimer scheduledTimerWithTimeInterval:delay target:self selector:@selector(switchControllerCallback) userInfo:nil repeats:NO]; 

} 

在这个时刻,我已经开始为即将离任的退出动画视图,并且此方法记录控制器并计划一个方法,该方法将在传出视图完成动画时执行实际切换。像这样:

-(void) switchControllerCallback 
{ 
    self.mSwitchControllerTimer = nil; 

    // remove outgoing view 
    [mOutgoingController.view removeFromSuperview]; 

    // add incoming view 
    [self attachViewForController:mIncomingController]; 
} 

这是一个体面的管理方式吗?有几点:

  1. 我知道我大概可以代替设置一个回调触发传出控制器动画结束的时候,却选择了只通过一个明确的延迟PARAM这样做是为了留有余地,让我的淡入淡出的意见。不过,我认为早些时候调用setControllerSwitch可能实际上不允许交叉淡入淡出,因为它会提早垃圾旧控制器并使其切断动画。

  2. 如前所述,我很想知道是否明确调用viewWillAppear是否是否定的,并且有更合适的方法来管理视图流。

+0

是否有一个原因,你是手动实现自己的视图控制器导航,而不是使用内置的视图控制器的推送和弹出? – 2012-05-05 16:18:43

回答

1

从Apple开发者文档复制,但它帮助我了解有关视图和混淆多个视图。

提示使用视图有效

自定义视图是当您需要画点什么标准体系的意见不提供情况下非常有用,但它是你的责任,以确保您的看法表现还是不错的足够。 UIKit尽其所能来优化与视图相关的行为,并帮助您在自定义视图中实现良好的性能。不过,您可以考虑以下提示来帮助UIKit在这方面。

观点不一定有相应的视图控制器

很少有应用程序中的个人观点和看法控制器之间的一比一的关系。视图控制器的工作是管理视图层次结构,该视图层次结构通常包含多个用于实现一些独立功能的视图。对于iPhone应用程序,每个视图层次结构通常填充整个屏幕,但对于iPad应用程序,视图层次结构可能只填充屏幕的一部分。

您在设计应用程序的用户界面,它要考虑到视图控制器将扮演的角色是非常重要的。视图控制器提供了许多重要的行为,例如协调屏幕上的视图显示,协调从屏幕移除这些视图,释放内存以响应低内存警告,以及响应界面方向更改而旋转视图。避免这些行为可能会导致您的应用程序出现错误或意外的行为。

欲了解更多信息视图控制器及其在应用中的作用,请查看iOS视图控制器编程指南。

最小化定制绘图

虽然自定义绘制,有时是必要的,这也是你应该避免任何可能。只有当现有的系统视图类没有提供您需要的外观或功能时,您才应该真正做到任何自定义绘图。只要您的内容可以与现有视图组合在一起,最好的办法就是将这些视图对象组合到一个自定义视图层次结构中。

走内涵模式

内容模式的优势最大限度地减少耗时间重绘你的看法。默认情况下,视图使用UIViewContentModeScaleToFill内容模式,该模式缩放视图的现有内容以适合视图的框架矩形。您可以根据需要更改此模式以不同的方式调整您的内容,但是如果可以的话,您应该避免使用UIViewContentModeRedraw内容模式。无论哪种内容模式生效,您都可以通过调用setNeedsDisplay或setNeedsDisplayInRect:来强制视图重绘其内容。

声明视图作为不透明每当可能

UIKit中使用的每个视图的不透明属性来确定视图是否可以优化合成操作。将自定义视图的该属性值设置为YES会告诉UIKit它不需要在视图后面呈现任何内容。较少的渲染可以提高您的绘图代码的性能,并且通常会受到鼓励。当然,如果将opaque属性设置为YES,则视图必须完全填充完全不透明内容的边界矩形。

调整您的视角的绘画行为当滚动

滚动可以在很短的时间量招致众多视图更新。如果您的视图的绘制代码未适当调整,则视图的滚动性能可能会很低。在开始滚动操作时,不要试图确保视图的内容始终处于原始状态,而应考虑更改视图的行为。例如,您可以暂时降低渲染内容的质量,或在滚动正在进行时更改内容模式。当滚动停止时,您可以将视图恢复到之前的状态并根据需要更新内容。

不要被嵌入子视图

自定义控件虽然在技术上是可能的子视图添加到继承的标准的系统控制的对象UIControl,你永远不应该对其进行自定义以这种方式。支持自定义的控件通过控件类本身的明确和详细记录的接口来实现。例如,UIButton类包含用于设置按钮的标题和背景图像的方法。使用定义的定制点意味着您的代码将始终正常工作。通过在按钮中嵌入自定义图像视图或标签来限制这些方法,如果按钮的实现发生更改,则可能会导致应用程序现在或未来某个时刻的行为不正确。

相关问题