首页 > 代码库 > 斯坦福大学IOS开发课程笔记(第七课第一部分)
斯坦福大学IOS开发课程笔记(第七课第一部分)
转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/31462099
作者:小马
这节课的内容太多,分两部分介绍。本节课主要是介绍如何开发基于ipad的应用程序,涉及到了一些只有ipad才有的类,接口等。
先讲到UIToolbar工具栏,常用的UI控件。在工具栏上按钮一样的东西叫UIBarButtonItems,可以像一般按钮一样操作它,比如建立outlet,action等。使用的时候只要从工具箱里拖到视图中就可以了,当然如果你想动态的控制,用代码实现也是没问题的,第二部分的demo程序就会涉及到这一点。
上图看到的UI效果叫分屏视图(split view),有一个控制器类叫UISplitViewController。 这个是只在ipad应用下才有的,也就是你新建工程时,要选择ipad或universal应用,才可以使用这个类。当然这个视图控件也只有在基于ipad的storyboard(一个工程可以有多个storyboard,后面的代码示例会看到这个用法)中才可以拖出来使用。应该可以理解为只有ipad才有这样的控件,毕竟屏幕比较大这样的显示效果才有意义。
既然是分屏,左边的叫全局栏(master),右边的叫细节栏(detail)。UISplitViewController本身有个NSArray类型属性叫viewControllers,数组第一个元素是master,第二个是detail。
分屏视图和代理(delegate)是永远不分家的,如果没有代理你会发现ipad竖屏时,左边栏会消失,你无法从任何地方开启它(正常情况下,是要有个toolbar上的按钮,按一下,左边栏会出现)。 这个在后面的代码示例中,我还会讲到。
这里既然提到ipad竖屏, 就多说一些,分屏视图在转到竖屏时,有两种显示方案,一是上面提到的左边栏消失,不过会在toolbar上放一个button,按一下就可以以Popover(后面会介绍)的形式弹出来。还有一种是左右同时显示,但是要”挤压”一下,就像ipad里的设置功能的UI一样。具体用哪一种还是要根据实际开发的功能以及显示效果。
我们一次讲完上面三幅图,说的是同一个函数,
(BOOL)splitViewController:(UISplitViewController*)sender shouldHideViewController:(UIViewController *)master inOrientation:(UIInterfaceOrientation)orientation
这个函数控制左边栏在不同方向是否隐藏。从上图三张图可以看到不同实现的显示效果,很容易理解,不多说。
控制左边栏如何显示需要用到代理,当前视图控制器把自己作为代理,并实现
UISplitViewControllerDelegate
这个协议里的一些方法, 上面提到的那个方法就是其中之一,当然还有其它方法,如下:
//左边栏将要隐藏时调用(比如由横屏转到竖屏) - (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc { //做两件事 //一,把工具栏上按钮的title设置成self.title(这里是"doctor") //二,把按钮放到工具栏上,这个任备要由右边栏完成,因为这个时候只有右边栏是显示的。 barButtonItem.title = self.title; [self splitViewBarButtonItemPresenter].splitViewBarButtonItem = barButtonItem; } //左边栏将要显示时调用(比如由竖屏转到横屏) - (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem { //把工具栏上的按钮移除,因为左边栏显示,所以不需要 [self splitViewBarButtonItemPresenter].splitViewBarButtonItem = nil; }
这里说到如何更新细节栏,当全局栏变化时,可能要更新细节栏中的显示,有两种方法。一种是很直接的,用target/action,相当于一个响应事件,在处理函数里设置就可以,如上图。还有一种不太常用,就是用segue, 这种方法其实相当于把整个原来的右边栏视图换掉,加载一个新的视图。相当少用。不过后面的代码示例中,会用到这一点,要留意。
这里讲到弹出窗口(popover)的一些属性,如何设置等,还有就是如何改变弹出窗口的默认行为,比如默认情况下,popover是在用户触摸到它的区域已外时会自动关闭,可以改变这种行为。比较简单。
第二部分会详细讲解代码示例。