Download presentation
Presentation is loading. Please wait.
1
《IOS应用开发教程》 QQ学习群:
2
第五章 IOS基础界面编程 QQ学习群:
3
2、掌握UIWindow与UIView的关系,并掌握UIView常见子类的使用方法。 3、掌握IOS中的坐标系统。
教学目标: 1、掌握IOS开发基本界面布局。 2、掌握UIWindow与UIView的关系,并掌握UIView常见子类的使用方法。 3、掌握IOS中的坐标系统。 4、IOS中常用控件的使用。 QQ学习群:
4
5.1UIWindow和UIView 在IOS平台上运行的应用程序都有一个UIApplication类的对象, UIApplication类继承域UIResponder类,它是IOS应用程序的起点, 并且负责初始化和显示UIWindow,它还将接受事件,通过委托 “UIAppliactionDelegate”来处理,还有一重要的功能就是帮助管理 应用程序的生命周期。 QQ学习群:
5
QQ学习群:262779381 应用程序状态表 状态名称 说明 Not running(未运行) 程序没有启动 Inactive(未激活)
程序在前台运行,但没有接收到事件 Active(激活) 程序在前台运行,而且接收到事件 Background(后台) 程序在后台但能执行代码 Suspended(挂起) 程序在后台不能执行代码 QQ学习群:
6
QQ学习群:
7
正如在上表与图中看到的几个程序状态,系统要做出不同的事件处理。 UIApplication的一个主要人任务就是处理用户事件,它会创建一个队列,将 所有用户事件都放入队列中,在处理过程中,它会发送当前事件到一个合适处 理事件的控件。换句话说,UIApplication类并不具体实现某项功能,它只是 负责监听事件,当需要实际完成工作时,就将工作分配给 UIApplicationDelegate去完成。而在UIApplicationDelegate中定义了很多 协议需要实现。这些协议中定义好的方法就是UIApplication对象监听到系统 变化的时候通知UIApplication对象代理类执行的相应方法。 QQ学习群:
8
1. -(void)applicationWillResignActive:(UIApplication
1. -(void)applicationWillResignActive:(UIApplication*)application 此方法在应用程序将要进入到非活动状态执行,在此期间,应用程序不接受消 息。 2. -(void)applicationDidBecomeActive:(UIApplication*)application 此方法在应用程序将要进入到活动状态执行,和第一个方法相反。 3. - (void)applicationDidReceiveMemoryWarning:(UIApplication*)applicatio n 执行这个方法可以进行内存清理防止程序被太多内存所占用而导致终止。 4. -(void)applicationDidFinishLaunching:(UIApplication*)application 这个方法的功能是在程序载入后可以执行一些用户需要的操作。 5.-(void)applicationDidEnterBackground:(UIApplication*)application 这个方法是在程序被推送到后台的时候调用。 注意:若在代码中提示release错误,说明程序使用了ARC(Automatic Reference Counting)机制,只需要去掉release方法,或者勾选去除ARC 机制,去除方法在Building Settings中的Apple LLVM6.0 - Language- Objective-C。 QQ学习群:
9
QQ学习群:262779381 #import "AppDelegate.h" @implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor cyanColor]; [self.window makeKeyAndVisible]; return YES; } - (void)applicationWillResignActive:(UIApplication *)application - (void)applicationDidEnterBackground:(UIApplication *)application - (void)applicationWillEnterForeground:(UIApplication *)application - (void)applicationDidBecomeActive:(UIApplication *)application - (void)applicationWillTerminate:(UIApplication *)application @end QQ学习群:
10
5.1.1窗口和视图 我们知道在Mac OS中,是支持多窗口任务的,但是在IOS应用程序中一般只 有一个窗口,表示为一个UIWindow类,IOS是单窗口多视图的一个系统。 UIWindow类一个应用程序最为基础的一个类,这就像我们的一个画布, UIWindow就是最底层的画布,我们需要做的就是往窗口中加入各种视图,来 完善我们的“绘画作品”。UIWindow其实也是一个视图,因为它的父类是 UIView。我们在创建一个应用程序时,系统会自动为我们创建一个 UIWindow。 QQ学习群:
11
- (BOOL)application:(UIApplication
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; self.window.backgroundColor = [UIColor cyanColor]; [self.window makeKeyAndVisible]; return YES; } 在应用程序载入的时候,系统就创建了一个UIWindow窗口作为基本的窗口, 并设置了他尺寸等于物理设备的尺寸,通过[UIScreen mainScreen] bounds]这条语句能获得不同设备当前的屏幕尺寸,可以通用与多种设备之 间。最后让窗口显示在屏幕上。我们一般不用去考虑对窗口的操作,一般的 操作都建立在视图上,但我们要了解窗口和视图之间的框架结构关系。 QQ学习群:
12
·CGPoint{x,y} 代表了所在视图的坐标信息 ·CGSize{width,height} 代表了所在视图的大小信息
视图是UIView类的实例,它负责在屏幕上绘制一个矩形区域。视图的作用主要体现 在用户界面的显示以及相应用户界面交互上。UIView有父视图(superview)和子 视图(subview)属性,而通过定义这两个属性,可以建立视图之间的层次关系, 并且这两个属性还关系到视图坐标的确定。 有3个和视图相关的结构体,分别是: ·CGPoint{x,y} 代表了所在视图的坐标信息 ·CGSize{width,height} 代表了所在视图的大小信息 ·CGRect{origin,size}所在视图所在坐标(视图左上角的点)和大小信息 还有3个相对应的函数 ·CGPointMake(x,y) 声明了位置信息 ·CGSizeMake(width,height) 声明了大小信息 ·CGRectMake(x,y,width,height) 声明了位置和大小信息 QQ学习群:
13
- (BOOL)application:(UIApplication
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //创建窗口 self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; self.window.backgroundColor = [UIColor cyanColor]; //创建视图 UIView *baseView = [[UIView alloc]initWithFrame:CGRectMake(10, 50, 300, 400)]; baseView.backgroundColor = [UIColor blackColor]; [self.window addSubview:baseView]; [baseView release]; [self.window makeKeyAndVisible]; return YES; } QQ学习群:
14
5.1.2IOS坐标系统 在使用UIView时,视图的坐标位置是一个很重要的信息,IOS中描述视图的坐 标位置的属性有三个,分别是frame、bounds和center,初学者对前两个属 性的使用上可能会有混淆,下面我们共同来学习一下IOS中坐标系统。 翻开IOS官方文档,我们可以看到对frame和bounds有如下的描述: ·View’s location and size expressed in two ways ·Frame is in terms of superview’s coordinate system ·Bounds is in terms of local coordinate system 我们来稍微解释一下它们的用法,frame属性是用来描述当前视图在父视图中 的坐标位置和大小;bounds属性是描述当前视图在其自身坐标系统中的位置 和大小。;而center属性则是描述了当前视图的中心点在其父视图中的位置。 通过前面的描述,我们可以看出虽然frame属性和bounds属性都是用来描述视 图的大小(CGSize)和位置(CGPoint)的,但是他们各自描述的视图不同, 换句话说,两者所在的坐标系是不同的。 QQ学习群:
15
4. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen]bounds]]; 5. self.window.backgroundColor = [UIColor whiteColor]; 6. UIView *view1 = [[UIView alloc]init]; 7. view1.frame = CGRectMake(0, 0, 320, 570); 8. view1.backgroundColor = [UIColor yellowColor]; 9. [self.window addSubview:view1]; 10. [view1 release]; 11. UIView *view2 = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 120, 200)]; 12. view2.backgroundColor = [UIColor cyanColor]; 13. [view1 addSubview:view2]; 14. [view2 release]; 15. = %.1f",view2.frame.origin.x); 16. = %.1f",view2.frame.origin.y); 17. = %.1f",view2.bounds.origin.x); 18. = %.1f",view2.bounds.origin.y); 19. UIView *view3 = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; 20. view3.backgroundColor = [UIColor blackColor]; 21. [view1 addSubview:view3]; 22. [view3 release]; 23. = %.1f",view3.frame.origin.x); 24. = %.1f",view3.frame.origin.y); 25. = %.1f",view3.bounds.origin.x); 26. = %.1f",view3.bounds.origin.y); 27. [self.window makeKeyAndVisible]; 28.return YES; QQ学习群:
16
在这个程序中,我们定义了3个视图,view1的大小和iPhone4的屏幕 大小相同,320
在这个程序中,我们定义了3个视图,view1的大小和iPhone4的屏幕 大小相同,320*480,view2是view1的子视图,而view3则是view2 的子视图。我们在前面说过,不同的视图层次关系会影响到视图的坐标 位置,frame属性是以父视图的坐标位置为基准,我们看到view2的 frame属性值是在父视图坐标为(100,100)处,视图左上角的坐标 点是(100,100),而bounds属性值是本视图坐标系的原点,所以 是(0,0),所以bounds值都为本视图的原点坐标,所以都是(0, 0)(也可以通过setbounds值来改变坐标的原点);我们再看view3 的frame值,通过效果图可能更能够理解。这里需要注意内存管理的问 题,在将view2添加到view1父视图中后,就可以对view2进行内存释 放。 QQ学习群:
17
我们看到view3的frame值是(0,0),但是它并 不是出于屏幕的左上角,而是出于父视图坐 标原点的位置,如果我改变view3的父视图 ,那它的位置就会有所改变。例如我将 view3的父视图设置为view2,将[view1 addsubview:view3]代码改为[view2 addsubview:view3],坐标信息不改变, 我们来看一下运行截图,效果如图5-4所示 。我们看到虽然坐标的信息没有改变,但是 因为父视图的改变,view3在屏幕中的位置 也出现了变化,读者可以自行分析具体的变 化情况。 通常我们在设置视图的坐标位置时,是使用 frame属性,bounds属性一般运用的比较 少,通过frame属性操作,可以很清晰的体 现出视图之间的层次关系。接下来我们就介 绍视图之间的层次关系。 QQ学习群:
18
5.1.3视图的层次关系及常用属性 我们把UIView层次结构看成数据结构中的树型结构,一个视图可以有多个子视图,但是 只能有一个父视图(基视图)。在我们添加子视图时,最后添加的视图会显示在最顶层 ,有点类似绘图工具中图层的概念。其实在前面的章节我们也了解了视图之间的层次关 系,但是我们如果要对某个视图进行操作,或者改变层次之间的关系时,该怎么样操作 呢?我们一一来讲解。 ·添加和移除子视图 添加和移除子视图是大家最常使用的操作,在添加子视图时,会进行一次retain操作 ,而移除子视图则会调用release消息,这些是自动完成,我们只需要了解各个时刻的引 用计数即可。 前面我们提到了添加子视图的操作就是[UIView addSubview:Subview],就不做 过多的解释。下面我们在程序清单IOS Coordinate的基础上将view3从父视图中删除, 并且来看一下引用计数的情况。 QQ学习群:
19
1. UIView *view3 = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; 2. view3.backgroundColor = [UIColor blackColor]; 3. [view1 addSubview:view3]; 4. = %.1f",view3.frame.origin.x); 5. = %.1f",view3.frame.origin.y); 6. = %.1f",view3.bounds.origin.x); 7. = %.1f",view3.bounds.origin.y); 8. //retainCount = 2 9. = %d",[view3 retainCount]); 10. [view3 removeFromSuperview]; 11. //retainCount = = %d",[view3 retainCount]); 13. [view1 release]; 14. [view2 release]; 15. [view3 release]; 16. [self.window makeKeyAndVisible]; 17. return YES; 运行时屏幕中的视图只有view1和view2,view3已经从父视图中移除。我们也可以看到引用计数在移除 前后的情况,要注意管理内存方面的问题。 QQ学习群:
20
·前移和后移视图 我们还是以程序清单IOS Coordinate为例。如果想让view2显示在view3上面,则可以使用 [UIView bringSubviewToFront:Subview];命令将特定视图移到顶层。在父视图管理子视图过程 中,是通过一个有序的数组存储着它的子视图,因此,数组存储的顺序就会影响到子视图的显示效果 。我们现在等于是将特定的子视图向前移动了,所以它能显示在上一层。 1.UIView *view3 = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)]; 2.view3.backgroundColor = [UIColor blackColor]; 3.[view1 addSubview:view3]; = %.1f",view3.frame.origin.x); = %.1f",view3.frame.origin.y); = %.1f",view3.bounds.origin.x); = %.1f",view3.bounds.origin.y); 8.[view1 bringSubviewToFront:view2]; 9.[view1 release]; 10.[view2 release]; 11.[view3 release]; 12.[self.window makeKeyAndVisible]; 13.return YES; QQ学习群:
21
·获取视图的index值 对多个视图进行操作,首先要获取各个视图的index值,我们可 以通过NSInteger index = [[UIView subviews]indexOfObject:Subview];语句来获取指定视图的 index值。例如我们要获取view3的index值,可以在代码中添加这 行代码。 2.UIView *view3 = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)]; 3.view3.backgroundColor = [UIColor blackColor]; 4.[view1 addSubview:view3]; 5.NSInteger index3 = [[view1 subviews]indexOfObject:view3]; = %d",index3); 7.[view1 release]; 8.[view2 release]; 9.[view3 release]; 10.[self.window makeKeyAndVisible]; 11.return YES; QQ学习群:
22
因为父视图管理子视图是通过数组的形式来管理,而view3在父视图管理数组的第二个位 置,所以它的index值为1(数组第一个元素从0开始)。通过这个index值我们可以对视 图进行更多的操作,比如将新视图加到特定的视图上,我们可通过 [View insertSubview:subview atIndex:0];命令将新视图添加到特定的视图上。 ·获取所有子视图信息 父视图可以通过[view1 subviews];命令将view1中所以的子视图的信息以数组的形式 在控制台输出,我们可以来看view1的子视图信息。 控制台输出结果: "<UIView: 0x751c350; frame = ( ; ); layer = <CALayer: 0x751a8d0>>", "<UIView: 0x751a990; frame = (50 50; ); layer = <CALayer: 0x751a9f0>>" 这里显示的是2个子视图的信息,它们都是继承于UIView类,我们可以通过frame值 来观察具体视图的情况,layer属性我们在后面的章节中会详细介绍,每一个视图都有一 个layer层,还可以自行添加。 QQ学习群:
23
·设置tag值对视图进行操作 通过设置视图的tag值,可以用来标示视图对象(整数),我们就能使用 viewWithTag方法来更方便的对视图进行操作。Tag值的默认值是0,我们可以 通过view.tag设置。接下来的例子我们做了一个小Demo,使用tag属性标记视 图,然后通过按钮来改变视图的层次关系和颜色,也结合了上小节的内容。首先 来看一下Demo中视图之间的层次关系, QQ学习群:
24
1. #import "AppDelegate. h" 2. @implementation AppDelegate 3
1.#import "AppDelegate.h" AppDelegate 3.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 4.{ 5.self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 6. self.window.backgroundColor = [UIColor whiteColor]; 7. //创建view1视图 8. UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 120, 160)]; 9. view1.tag = 1; 10. view1.backgroundColor = [UIColor yellowColor]; 11. [self.window addSubview:view1]; 12. //创建view2视图 13. UIView *view2 = [[UIView alloc]initWithFrame:CGRectMake(110, 150, 100, 50)]; 14. view2.tag = 2; 15. view2.backgroundColor = [UIColor blueColor]; 16. [self.window addSubview:view2]; 17. //创建改变视图层次按钮1 18. UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 19. button1.frame = CGRectMake(120, 270, 100, 30); 20. button1.backgroundColor = [UIColor whiteColor]; 21. [button1 top" forState:UIControlStateNormal]; 22. [button1 addTarget:self 23. forControlEvents:UIControlEventTouchUpInside]; 24. [self.window addSubview:button1]; QQ学习群:
25
25. //创建改变视图层次按钮2 26. UIButton
25. //创建改变视图层次按钮2 26. UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 27. button2.frame = CGRectMake(120, 320, 100, 30); 28. button2.backgroundColor = [UIColor whiteColor]; 29. [button2 top" forState:UIControlStateNormal]; 30. [button2 addTarget:self 31. forControlEvents:UIControlEventTouchUpInside]; 32. [self.window addSubview:button2]; 33. //创建改变颜色按钮 34. UIButton *button3 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 35. button3.frame = CGRectMake(120, 370, 100, 30); 36. button3.backgroundColor = [UIColor whiteColor]; 37. [button3 color" forState:UIControlStateNormal]; 38. [button3 addTarget:self 39. forControlEvents:UIControlEventTouchUpInside]; 40. [self.window addSubview:button3]; 41. [view1 release]; 42. [view2 release]; 43. [self.window makeKeyAndVisible]; 44. return YES; QQ学习群:
26
46. - (void)ViewChange1 47. { 48. UIView. view = [self
46.- (void)ViewChange1 47.{ 48. UIView *view = [self.window viewWithTag:1]; 49. [self.window bringSubviewToFront:view]; 50.} 51.- (void)ViewChange2 52.{ 53. UIView *view = [self.window viewWithTag:2]; 54. [self.window bringSubviewToFront:view]; 55.} 56.- (void)ViewChange3 57.{ 58. UIView *view = [self.window viewWithTag:2]; 59. view.backgroundColor =[UIColor greenColor]; 60.} QQ学习群:
27
我们定义了2个window的子视图,3个按钮的功能 分别为,让view1在上层,让view2在上层,改变 view2的颜色,如图5-7所示。这些都是通过使用 tag属性来获取当前的视图,通过这个例子我们也可 以发现使用tag属性的优点。按钮控件我们还没有讲 到,在后面的章节中会专门讲解控件的用法。 现在在window窗口视图上有5个子视图, UIButton类也是继承于UIView类,我们可以通过 [view subviews]命令来看一下所有子类信息的情 况。因为这5个视图都加在窗口上,是window的子 类,所以我们在定义它们的frame时要注意坐标要 以父类的坐标系为基础。 QQ学习群:
28
接下来我们介绍几个UIView常用的属性,读者可以在Xcode中查看相应的SDK 可以查看到相应的属性和方法的用法。 1
接下来我们介绍几个UIView常用的属性,读者可以在Xcode中查看相应的SDK 可以查看到相应的属性和方法的用法。 1.clipsTobounds属性 QQ学习群:
29
通过设置Cliptobounds属性可以将子视图超出父视图的范围隐藏起来,它的默 认值是NO。比如我们有两个视图,view2是view1的子视图,在定义它的大小 和坐标时,使它的坐标不全在view1的范围内,则会有很大的区域超出了view1 的范围,如果要隐藏这些超出的范围,我们可以使用view1.clipsTobounds = YES;语句来隐藏超出区域。通过效果截图可以清楚地观察设置clipsTobounds 属性前后的效果。 2.alpha属性 alpha属性在日常各种工具中都运用的比较广泛,它是用来设置视图的透明度 ,我们可以在初始化视图时对alpha属性进行设置,也可以通过点语法设置 alpha属性,但是我们要注意一个问题,如果设置父视图的alpha值为0.5,那么 在父视图中所有的子视图也变为透明了,所以如果要对视图设置alpha值时,要 注意这一个特性。在后面章节中实现动画效果时,我们也可以通过设置alpha值 来实现视图的渐隐渐现的效果,会在后面进行详细的讲解。 3.hidden属性 hidden属性从字面上看就能理解是用来隐藏视图的属性,设置hidden属性 可以让视图隐藏,而alpha属性类似,如果设置了父视图的hidden值为YES,那 么父视图上所有的子视图也跟着隐藏了。 QQ学习群:
30
5.1.4UIView中的layer属性 在前面章节中我们了解到UIView是iPhone编程中一个很重要的概念,它完成了 视图界面相关的工作,我们能在视图上进行各种可视化的操作,已达到用户所需 要达到的效果。其实在UIView中还有一个很重要的属性,就是layer属性,每一 个视图都有一个layer属性,也可以在基础的层(layer)上面在手动添加层。其 实我们在前面的学习中一个不经意的地方遇到过layer,在上一节5.1.3中,我们 在显示视图所有子视图的时候,我们在子视图中看到有layer,这说明layer是视 图中另个一重要的概念。 我们说UIView完成了可视化界面的绘制工作还是不准确的,因为真正绘图的 部分是由CALayer类来完成的,而我们可以说UIView的功能是CALayer的管理 容器,我们在访问UIView中和绘图、坐标有关属性时,其实是访问了它管理的 CALayer的相关属性。 QQ学习群:
31
在使用layer属性之前,我们需要将QuartzCore
在使用layer属性之前,我们需要将QuartzCore.framework框架引入到项目中, 如果不引入,我们就无法使用layer的相关属性。相信添加框架的过程大家应该掌握, 我们这里在讲解一遍。 首先在选择当前的项目,然后再选项卡中选择Build Phases,然后选择Link Binary With Libraries选项,最后搜索相应的框架单击“+”按钮进行添加,如图所 示。 QQ学习群:
32
首先我们可以通过点语法来设置layer的基本属性,比如背景颜色,层的圆角程度 等。圆角属性可以通过self. view. layer
首先我们可以通过点语法来设置layer的基本属性,比如背景颜色,层的圆角程度 等。圆角属性可以通过self.view.layer.cornerRadius属性来设置;还有一点, 其实layer属性和UIView视图的用法是很相似的,都是类似树型的结构,就是说 多个layer之间也存在父层和子层的概念。下面在我们创建一个视图,然后对视 图的layer属性进行操作。 1.//创建视图 2. UIView *baseView = [[UIView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame]; 3. baseView.backgroundColor = [UIColor blueColor]; 4. [self.view addSubview:baseView]; 5. //设置视图的layer属性 6. baseView.layer.backgroundColor = [UIColor orangeColor].CGColor; 7. baseView.layer.cornerRadius = 20.0f; 8. //创建子layer层 9. CALayer *Mylayer = [CALayer layer]; 10. Mylayer.frame = CGRectMake(50, 100, 200, 100); 11. Mylayer.backgroundColor = [UIColor redColor].CGColor; 12. Mylayer.cornerRadius = 10.0f; 13. [baseView.layer addSublayer:Mylayer]; QQ学习群:
33
相信上面的代码读者们自行能够理解,我觉得大家可能在设置layer层背景颜色 上会有点疑问,为什么在[UIColor redColor]后面要使用CGColor属性呢?如 果将.CGColor去掉会怎样?如果将.CGColor去掉的话,系统会报错误。原因是 在对layer层进行操作时,我们需要用到CGColor类,它主要用于 CoreGraphics框架之中,CGColor是一个结构体,我们通常在使用CGColor时 是使用它的引用类型CGColorRef。 我们利用cornerRadius属性将层的4个角设置成了圆角,然后又在视图的层上 面添加了一个子层。是不是和UIView很类似?其实二者还是有一个很重要的不 同,就是UIView可以相应用户事件,而CALayer不行。UIView主要是用于对 显示内容的管理,而CALayer侧重于对内容的绘制。我们可以来比较UIView和 CALayer之间的不同。相同点是二者都拥有树型的结构,都能够显示绘制的内容 ;不同的是UIView是用来显示内容的,并且可以处理用户事件,而CALayer是 用来绘制内容的,还可以实现复杂的动画效果,但是CALayer不能处理用户事件 。二者之间关系紧密,UIView是CALayer高层的实现与封装,而CALayer也依 赖于UIView提供的容器来显示绘制的内容。 QQ学习群:
34
我们还可以为子层添加阴影效果,用户可以自行设置阴影的偏移量、颜色、半径 等属性。我们在上面代码的基础上为子层设置阴影效果。 1
我们还可以为子层添加阴影效果,用户可以自行设置阴影的偏移量、颜色、半径 等属性。我们在上面代码的基础上为子层设置阴影效果。 1.//创建子layer层 2.CALayer *Mylayer = [CALayer layer]; 3.Mylayer.frame = CGRectMake(50, 100, 200, 100); 4.Mylayer.backgroundColor = [UIColor redColor].CGColor; 5.Mylayer.cornerRadius = 10.0f; 6.Mylayer.shadowOffset = CGSizeMake(0, 3);//设置偏移量 7.Mylayer.shadowRadius = 5.0;//设置半径 8.Mylayer.shadowColor =[UIColor blackColor].CGColor; 9.Mylayer.shadowOpacity = 0.8;//设置阴影的不透明度 10.[baseView.layer addSublayer:Mylayer]; QQ学习群:
35
还可以在层上面添加图片,这些方法都是类似于绘图工具中图层的概念,将所需 要显示的内容以子层的形式加到父层中。接下来我们在子层上面添加一幅图片, 我们可以自行定义图片的大小,也可以将图片的大小设置成和图片父层大小相同 。 1.//添加图片层 2.CALayer *imageLayer =[CALayer layer]; 3.imageLayer.frame = Mylayer.bounds; 4.imageLayer.cornerRadius =10.0f; 5.imageLayer.contents =(id)[UIImage 7.imageLayer.masksToBounds =YES; 8.[Mylayer addSublayer:imageLayer]; QQ学习群:
36
5.1.5内容属性模式 (ContentMode) ContentMode(内容模式)是用来设置视图的显 示方式,如居中、向左对齐、缩放等,它是一个枚 举类型的数据,里面有很多常量,读者可以通过阅 读API来浏览有哪些常量。我们下面就列出了 ContentMode中的常量,如图所示。 QQ学习群:
37
些属性都是各种显示视图的方式,读者可以自行测试,我们在这也不做过多的解 释。下面给出一张苹果官方关于ContentMode属性的图示,见下图5-13。如果 要设置视图的ContentMode属性,可以通过view.ContentMode来设置,选择 属性的时候可以按住Command键进入API接口中进行选择,以防止有些读者忘 记ContentMode中有哪些常量。 还要注意上面常量中不带scale的常量,如果当需要显示的内容的尺寸超过当 前视图的尺寸时,只会有部分内容显示在视图中。 UIViewContentModeScaleToFill属性会通过拉伸内容来填满整个视图,所以 这个属性会导致图片的变形;UIViewContentModeScaleAspectFit会根据原 内容的比例填满整个视图,这也意味着视图中可能会有部分区域是空白的; UIViewContentModeScaleAspectFill属性也保证原内容的比例不变来填充整 个视图,这样的话可能会导致只有部分的内容显示在视图中。我们可以通过图5- 9来观察各个属性的特性。 QQ学习群:
38
5.2常用UIView控件的使用 在5.1小节中,我们已经学习了UIView的基本概念和用法。在这里我们还要向 读者解释一下如何学习这些UIView的子类,我们知道UIView有很多的子类,我 们在表5-1中列出了UIView子类的情况。 UIView UIWindow UILabel UIPickerView UIProgressView UIActivityIndicatorView UIImageView UITabBar UIToolbar UINavigationBar UITableViewCell UIActionSheet UIAlertView UIScrollView UISearchBar UIWebView UIControl QQ学习群:
39
我们在学习这些子类时,首先需要了解这些子类都是什么含义,有哪些作用,什 么时候能用到,之后再选择其中几个比较重要,也是比较常用的子类来重点学习 它的用法,属性及延伸的特性。如果某个时候需要用到哪些控件时,我们可以查 看相应的参考文档去了解它的用法即可,这个过程花不了多少时间,读者大可不 必把每个控件的使用都掌握的很熟练,有的只须了解即可。 QQ学习群:
40
5.2.1UILabel 我们从字面上可以看出,UILabel类的功能就是提供对标签的显示和编辑,在使用UILabel时,有比较多的属性需要我们了解的, NSString *text; UIFont *font; UIColor *textColor; UIColor *shadowColor; CGSize shadowOffset; //设置标签阴影的偏移量,默认为CGSizeMake(0, -1) – NSTextAlignment textAlignment; NSLineBreakMode lineBreakMode; // UIColor *highlightedTextColor; BOOL highlighted; BOOL userInteractionEnabled; NSInteger numberOfLines; //当使用了sizeToFit属性时,numberOfLines属性决定了标签中显示内容的行数,默认为1,当选择0时,说明对行数没有限制, 当文本内容超过了行数的限制,它会使用换行符模式 QQ学习群:
41
接下来我们来学习UILabel的使用。 在创建项目时,我们还是选择Single View Application模板,首先在
接下来我们来学习UILabel的使用。 在创建项目时,我们还是选择Single View Application模板,首先在.m文件中 的viewDidLoad方法中创建一个UILabel实例,并设置文本的内容。 1.-(void)viewDidLoad{ 2. UILabel *myLabel = [[UILabel alloc]initWithFrame:CGRectMake(50, 90, 240, 100)]; 3. myLabel.font = [UIFont systemFontOfSize:30]; 4. myLabel.text } 我们在创建UIView子类实例的时候,要记住要将子类添加到相应的视图上,这 样才能在相应的视图上显示,这一点也是很多初学者容易忽略的。font属性代表 字体的大小,text属性设置Label实例的文字内容。 [self.view addSubview:myLabel]; QQ学习群:
42
可能大家觉得标签比较的单调,我们给标签加上颜色并设置它的阴影效果。这样 效果会更加明显。 5. myLabel
可能大家觉得标签比较的单调,我们给标签加上颜色并设置它的阴影效果。这样 效果会更加明显。 5.myLabel.text 6.myLabel.backgroundColor = [UIColor blueColor]; 7.myLabel.textColor = [UIColor redColor]; 8.myLabel.shadowColor = [UIColor blackColor]; 9.myLabel.shadowOffset = CGSizeMake(2, 5); 10.[self.window addSubview:myLabel]; 这里我们设置了标签的背景颜色为蓝色,字体颜色为红色,阴影效果的颜色为 黑色,偏移量坐标设置为(2,5),这个坐标代表了向XY正半轴的偏移量。我 们通过图5-15看一下设置属性之后的标签情况。 QQ学习群:
43
细心的读者会发现,文本的内容并没有完全显示,因为我们定义了标签的大小,如果文本的内容超出了标签定义的大小,系统会根据换行符模式(LineBreakMode)的状态来选择显示文本的方式。我们在前面也提到了换行符模式的缺省值(默认)是NSLineBreakByTruncatingTail,将末尾超出标签的部分截去。我们也可改变模式来显示文本,读者可以通过SDK来观察6中不同模式的显示方式。 QQ学习群:
44
如果我们想要完整的显示标签中文本的内容, 我们可以调用sizeToFit方法,它是一个返回值 为空的方法,直接使用实例调用即可,这样就 可以显示所有的文本信息,但是文本框的大小 也会根据文本内容的多少而进行相应的改变。 所以当我们调用sizeToFit方法时,最好和 numberOfLines属性同时使用,如果不使用 numberOfLines属性,默认的标签行数是1行 ,假设文本的内容很多时,则可能标签的长度 变得很长,以至于超出了屏幕的范围,所以我 们可以通过设置numberOfLines属性来增加标 签的行数。下面我们可以通过图来观察使用 numberOfLines和sizeToFit方法之后的标签实 例效果。 QQ学习群:
45
5.2.2UIControl UIControl类是一个具有事件处理的控件的分类,它包括的事件有三类:基于触 摸、基于值和基于编辑。比如我们在接下来要介绍的UITextField和UIButton它 们都是有一个事件处理的控件。 ·UIButton 在前面的章节中我们接触过UIButton,这一小节我们详细的讲解UIButton 的用法。 首先我们可以设置按钮的类型,系统为用户提供了多种ios自带的系统按钮, 我们在初始化对象时可以自己选择需要的按钮,一般情况我们定义为圆角按钮, 用户可以自定义按钮,比如改变按钮的背景颜色,为按钮添加图片等。 下面我们列出几种按钮类型对应的按钮形状,如下表5-2所示。 UIButtonType是一个枚举类型的数据类型,它的默认值是自定义类型,值 为0,按表格中的顺序值依次为1-5。这里还要提一下,表5-2中前两种按钮类型 可以自定义按钮在屏幕中的位置和按钮大小,但是其他4中系统按钮图标的大小 用户不能进行自定义,系统已经定义好了它们的大小,我们只能设置它在屏幕中 坐标位置。 QQ学习群:
46
UIButtonTypeRoundedRect
选择好按钮的形状之后,我们可以设置相应的按钮自身的属性,比如按钮中的文 字、颜色、添加背景等。下面我们就在XCode中创建一个普通的按钮,并设置 相关的属性。 按钮类型 按钮形状 UIButtonTypeCustom 自定义 UIButtonTypeRoundedRect UIButtonTypeDetailDisclosure UIButtonTypeInfoLight UIButtonTypeInfoDark UIButtonTypeContactAdd QQ学习群:
47
创建一个Single View Application项目模板,并在
创建一个Single View Application项目模板,并在.m文件中的viewDidLoad 方法中创建一个UIButton实例。 1.- (void)viewDidLoad { 2. [super viewDidLoad]; 3. // Do any additional setup after loading the view, typically from a nib. 4. UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 5. button.frame = CGRectMake(90, 100, 100, 40); 6. [button forState:UIControlStateNormal]; 7. [button setTitleColor:[UIColor redColor]forState:UIControlStateNormal]; 8. [self.view addSubview:button]; 9.} QQ学习群:
48
在代码中我们发现有一个forState属性,它代表了按钮的状态信息,比如是选中 还是禁用。而ios中组件一般有四种状态。 1
在代码中我们发现有一个forState属性,它代表了按钮的状态信息,比如是选中 还是禁用。而ios中组件一般有四种状态。 1.正常状态(UIControlStateNormal):系统默认的状态即为正常状态。 2.高亮状态(UIControlStateHighlighted):用户正在使用时组件的状态, 比如我们单击一个按钮时就是高亮状态。 3.禁用状态(UIControlStateDisabled):在禁用状态下,用户不能对组件进 行操作,要设置按钮的禁用状态,需要把按钮的Enable属性设置为NO。 4.选中状态(UIControlStateSelected):选中状态和高亮状态比较类似,不 同的是不用点击该按钮它一直会显示为高亮的效果。该状态一般用在指明组件被 选中或被打开。 同时我们也可以改变在不同状态时按钮中的字体,这样就提供在多种不同情况下 对按钮的灵活使用。 QQ学习群:
49
我们还可以为按钮添加图片,先要将图片素材文件导入到工程当中,导入的方法 在前面的章节中也有提到,注意勾选Copy items into destination group’s folder(if needed)选项。然后设置按钮图片属性。 [button setImage:[UIImage forState:UIControlStateNormal]; 在设计iPhone应用时常常利用这种方式自定义按钮,以达到选择按钮后出现不 同状态的效果。但是要注意的是,如果我们要实现多种状态按钮的切换效果,在 开始创建UIButton实例时要把按钮的状态设置成自定义。 创建和设置按钮属性的工作实现了,接下来就是要实现按钮单击的效果了,因为 按钮也是一个具有事件处理功能的组件,而且在实际的项目中运用的也是非常的 广泛,这个部分也是本小节中的重点内容。 QQ学习群:
50
设置动作的两个主要的方法分别是: //添加动作方法 -(void)addTarget:(id) action:(SEL)>forControlEvents:(UIControlEvents); //移除动作方法 -(void)removeTarget:(id) action:(SEL)forControlEvents:(UIControlEvents); 接下来我们解释一下方法中的各个参数的含义。 (id)target是指制定的目标,一般都是自己self; action:(SEL)是选择要执行的方法,还需要用户实现它的功能; (SEL)forControlEvents:(UIControlEvents)是指消息处理时的事件,例如是 单击按钮还是拖动等。 SDK为我们列出了所有可以用于事件处理的组件事件,用户可以在 UIControlEvents上按住Command再单击查看ios SDK。这些事件能够帮助我 们完成所有关于事件处理组件的设计。接下来我们实现一个简单地功能,首先有 一个空白的Label标签,单击按钮之后会在标签中显示文字,并且按钮中的内容 会显示“已显示信息”,之后按钮就处于禁用状态。 QQ学习群:
51
在XCode中新建一个Single View Application项目模板,然后在 AppDelegate
在XCode中新建一个Single View Application项目模板,然后在 AppDelegate.h中定义UILabel和UIButton两个实例。 AppDelegate : UIResponder <UIApplicationDelegate> 2.{ 3. UILabel *label; 4. UIButton *button; 5.} 6.self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 7.//创建UILabel实例 8.label = [[UILabel alloc]initWithFrame:CGRectMake(90, 70, 150, 30)]; 9.label.backgroundColor = [UIColor blackColor]; 10.label.font = [UIFont systemFontOfSize:30]; 11.[self.window addSubview:label]; 12.//创建UIButton实例 13.button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 14.button.frame = CGRectMake(90, 100, 150, 80); 15.[button forState:UIControlStateNormal]; 16.[button setTitleColor:[UIColor grayColor] forState:UIControlStateHighlighted]; 17.[self.window addSubview:button]; 18.self.window.backgroundColor = [UIColor whiteColor]; 19.[self.window makeKeyAndVisible]; 20.return YES; QQ学习群:
52
完成了界面组件设置之后,就要实现按钮的功能了。在AppDelegate.m文件中 ,为button添加单击事件,并实现。
21.button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 22.button.frame = CGRectMake(90, 100, 150, 80); 23.[button forState:UIControlStateNormal]; 24.[button setTitleColor:[UIColor grayColor] forState:UIControlStateHighlighted]; 25.[self.window addSubview:button]; 26.//添加按钮单击事件 27.[button addTarget:self forControlEvents:UIControlEventTouchUpInside]; 28.self.window.backgroundColor = [UIColor whiteColor]; 29.[self.window makeKeyAndVisible]; 30.return YES; 31.//实现按钮单击事件 32.- (void)click 33.{ label.text label.textColor = [UIColor whiteColor]; label.textAlignment = NSTextAlignmentCenter; [button forState:UIControlStateNormal]; button.enabled = NO; 39.} QQ学习群:
53
别忘了管理所创建实例的内存,在dealloc方法中release UIabel的实例。如果 实在ARC机制下,则不需要手动释放内存。 40
别忘了管理所创建实例的内存,在dealloc方法中release UIabel的实例。如果 实在ARC机制下,则不需要手动释放内存。 40.- (void)dealloc 41.{ 42. [_window release]; 43. [label release]; 44. [super dealloc]; 45.} QQ学习群:
54
·UITextField UITextField也是一个比较常用的类,它通常用于外部数据的输入,用来实现 人机交互的效果。比如我们常用的系统用户登录界面就是通过UITextField类将 用户输入的数据传到服务器中。接下来我们就来学习UITextField类的用法。 和UILabel类相似,文本框也能设置它的文本内容、字体颜色大小、占位符 等等,还能设置文本框的外框类型。UITextField类中还有很多代理方法,帮助 用户在文本框不同状态时进行相应的操作。 我们通过一个简单的用户登录界面来学习UITextField类常用的属性和方法。 QQ学习群:
55
1. #import <UIKit/UIKit. h> 2
1.#import <UIKit/UIKit.h> ViewController : UIViewController 3.{ 4. UILabel *username; 5. UITextField *UserName; 6. UILabel *userpsw; 7. UITextField *UserPsw; 8.} 10.//创建用户标签 11.username = [[UILabel alloc]initWithFrame:CGRectMake(40, 80, 100, 20)]; 12.username.font = [UIFont size:18.0f]; 13.username.text 14.[self.view addSubview:username]; 15.//创建用户文本框 16.UserName = [[UITextField alloc]initWithFrame:CGRectMake(150, 70, 150, 40)]; 17.UserName.font = [UIFont size:18.0f]; 18.[UserName setBorderStyle:UITextBorderStyleRoundedRect]; 19.UserName.clearButtonMode = UITextFieldViewModeAlways; 20.UserName.returnKeyType = UIReturnKeyDone; 21.UserName.placeholder 22.[self.view addSubview:UserName]; QQ学习群:
56
创建标签实例的方法相信大家已经掌握,我们介绍一下UITextField中的一些属 性和方法。 setBorderStyle属性是设置文本框的外边框类型,它的默认值是无边框,但为 了能够更好地显示,将属性设置为圆角类型 (UITextBorderStyleRoundedRect); clearButtonMode属性则设置了清除按 钮出现的时间,可以让它一直显示,也可以在输入中或输入完成后显示,用户可 以根据自己的喜好来设置;returnKeyType属性设置了确定按钮的类型,我们 这里设置成了”Done”;占位符的设置前面的内容也有介绍,也可以根据自己的 喜好设置。 文本中还可以设置字体,比如我们在代码中设置字体为UserName.font = [UIFont size:18.0f];那有些读 者可能就会有疑问,我怎么知道有哪些字体?而这些字体又是怎么样的效果?别 担心,系统将所有的字体都封装在数组中,如果需要查看,可以通过遍历数组的 元素来查看系统为我们提供了哪些字体。 QQ学习群:
57
接下来我们就用快速枚举方法在控制台中打印字体的信息。我们定义一个打印字体的方法(PrintfontName),并实现。
- (void)PrintfontName { for(NSString *familyName in [UIFont familyNames]) = familyName); for(NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) = fontName); } QQ学习群:
58
然后我们在载入窗口方法中调用显示字体的函数。[self PrintfontName];这样在控制台中就会打印出字体的信息,用户可以根据自己的喜好来选择字体。
接下来就要处理键盘事件了,当我们单击文本框时,系统会自动弹出键盘供用户输入,而我们也可选择键盘的样式,是普通键盘还是数字键盘,当然还可以用户自定义键盘。而在用户结束输入之后,我们还要让键盘在屏幕上消失来继续下一步的操作。 首先我们选择键盘的样式,因为是输入用户的名称,所以我们选择普通的键盘,如果要输入数字或电话号码,可以通过keyboardType属性分别选择对应的属性。我们会在密码输入文本框中介绍数字键盘的使用。想要在输入完成之后让键盘消失,需要运用到UITextField的代理方法,并将textField的代理设置为self。如果要使用代理方法,首先还要在ViewController.h文件的接口中声明代理的名称。 QQ学习群:
59
1.#import <UIKit/UIKit.h>
ViewController : UIViewController<UITextFieldDelegate> 3.添加代理完毕之后,在AppDelegate.m文件中实现用户输入完成的代理方法。 4.- (BOOL)textFieldShouldReturn:(UITextField *)textField 5.{ 6. [textField resignFirstResponder]; 7.return YES; 8.} 这样就可以实现隐藏键盘的功能。还有一些可选的代理方法,用户可以参照SDK中列出的方法进行学习。 [resignFirstResponder]这个方式是失去第一响应者的意思,就是说当调用此方法时,textField此时已经不是第一响应者,就不会去实现系统为文本框封装的操作,如显示键盘。相应的[becomeFirstResponder]方法是成为第一响应者的意思,比如有两个文本输入框,光标默认在text1中,此时的第一响应者就是text1。如果你想点击一个按钮使得光标移动到text2中,就可以通过按钮实现[becomeFirstResponder]这个方法即可,那么此时的第一响应者就是text2了,用户就能对text2中得内容进行编辑。 QQ学习群:
60
在设计完用户名输入框之后,接下来就要创建用户密码的标签和文本输入框,在设计密码文本框时要注意,我们这里的密码采用纯数字形式,由于内容的需要我们把密码设置为纯数字,一般的情况下都是字母+数字的形式;还有一点输入密码时为了保证密码的安全,我们要把输入的字符用“*”号代替,这里就要TextField的secureTextEntry属性设置为YES,这样显示时密码就会以*号代替。 9.//创建用户密码标签 10.userpsw = [[UILabel alloc]initWithFrame:CGRectMake(40, 150, 100, 20)]; 11.userpsw.font = [UIFont size:18.0f]; 12.userpsw.text 13.[self.window addSubview:userpsw]; 14.//创建用户密码文本框 15.UserPsw = [[UITextField alloc]initWithFrame:CGRectMake(150, 140, 150, 40)]; 16.UserPsw.font = [UIFont size:18.0f]; 17.[UserPsw setBorderStyle:UITextBorderStyleRoundedRect]; 18.UserPsw.clearButtonMode = UITextFieldViewModeAlways; 19.UserPsw.keyboardType = UIKeyboardTypeNumberPad; 20.UserPsw.placeholder 21.UserPsw.secureTextEntry = YES; 22.UserName.placeholder QQ学习群:
61
但是现在还有一个问题,在输入完密码之后,键盘不能消失,那么就不能进行下一步的操作。在普通键盘中,我们可以使用代理方法单击“Done”按钮隐藏键盘,但是数字键盘中并没有“Return”或“Done”按钮,该如何操作呢? 方法也是有多种,我们这里选择添加一个手势,当单击非键盘区时会失去第一响应者,从而隐藏键盘。 在ViewController.m文件中,在创建完实例之后接着创建一个手势,并将手势添加到窗口上。 23.UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] 24.initWithTarget:self 25.[self.view addGestureRecognizer:tapRecognizer]; 26.- (void)handleBackgroundTap:(UITapGestureRecognizer *)sender 27.{ [UserPsw resignFirstResponder]; 29.} QQ学习群:
62
5.2.3UISlider UISlider控件一般用于系统声音、亮度等设置,也可以表示播放音视频的进度。UISlider控件的使用比较简单,在实际项目中,程序员一般不会用系统自定义的滑块,而是会根据项目自身的情景设定自定义与项目场景一致的滑块。 我们可以通过一个例子来了解UISlider的基本属性和用法。 新建一个Single View Application项目模板,然后定义UISlider和UILabel两个实例。我们要实现的效果就是滑动滑块时标签里地数值会根据滑动的情况而相应的改变。 在ViewController.h文件中定义两个实例。 1.#import <UIKit/UIKit.h> ViewController : UIViewController 3.{ 4. UISlider *slider; 5. UILabel *label; 6.} QQ学习群:
63
接着在ViewController.m文件中创建我们的实例。在以前的例子中,我们都是将自定义的一些实例放在application didFinishLaunchingWithOptions方法中实现,这样不利于后期代码的维护工作,所以最好将自定义视图的创建放在viewDidLoad方法中,然后在载入应用中通过[self viewDidLoad],调用自定义视图方法。这样一目了然的视图创建方式是一个很好的编程习惯。 8.- (void)viewDidLoad 9.{ //创建UISlider实例 slider = [[UISlider alloc]initWithFrame:CGRectMake(80, 50, 200, 20)]; [slider setMaximumValue:100]; [slider setMinimumValue:0]; slider.value = 10; [self.view addSubview:slider]; //创建UILabel实例 label = [[UILabel alloc]initWithFrame:CGRectMake(10, 50, 40, 20)]; [self.view addSubview:label]; 19.} QQ学习群:
64
这样我们就完成了实例的创建。其中UISlider最重要的属性是设置滑块的最大最小值和默认值,要完成滑动滑块改变标签的值的效果还要添加一个动作,而控制事件要设置为UIControlEventValueChanged。 20.- (void)viewDidLoad 21.{ //创建UISlider实例 slider = [[UISlider alloc]initWithFrame:CGRectMake(80, 50, 200, 20)]; [slider setMaximumValue:100]; [slider setMinimumValue:0]; slider.value = 10; [slider addTarget:self forControlEvents:UIControlEventValueChanged]; [self.view addSubview:slider]; //创建UILabel实例 label = [[UILabel alloc]initWithFrame:CGRectMake(10, 50, 40, 20)]; [self.view addSubview:label]; 33.} QQ学习群:
65
接着实现我们传值的方法。 34.- (void)value 35.{ int intValue = (int)(slider.value); 37.NSString *stringValue = [[NSString label.text = stringValue; [stringValue release]; 40.} 在value方法中,我们将滑块的值传给标签,使得值能够在标签中显示。在赋值的过程中,要注意label中文本的类型是NSString,而滑块的数据类型是float类型,直接赋值是会出现编译错误的。所以我们定义一个NSString类型的数据,并用格式化的字符来初始化,这样就能将slider的值传给标签了。我们可以通过图来查看最后的效果。 QQ学习群:
66
接下来我们就用快速枚举方法在控制台中打印字体的信息。我们定义一个打印字体的方法(PrintfontName),并实现。
- (void)PrintfontName { for(NSString *familyName in [UIFont familyNames]) = familyName); for(NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) = fontName); } QQ学习群:
67
这就是系统UISlider的用法,用户还可以自定义各种美观的滑块,可以添加自己喜欢的图片作为滑块两边的背景,这部分内容希望读者能够通过查阅SDK自己实现。
QQ学习群:
68
5.2.4UISegmentedControl和UIPageControl
UISegmentedControl(分段控件)也是在实际项目中常用到的控件,它主要的功能是用于不同类型信息的选择和在不同屏幕间切换。下面我们就在Xcode中创建一个UISegmentedControl实例,并来学习它的基本属性和基本方法的使用。 新建一个Singel View Application项目模板,在ViewController.m文件中创建我们的实例。 分段控件中每个按钮的信息是通过一个数组来存储的,所以在创建分段控件实例之前,我们需要创建一个数组来存储按钮的信息。要注意,分段控件的长度是有限的,定义数组时元素的值最好不要超过4个。 创建NSArray数组的一般方法是: NSArray *items = [[NSArray 在新版本中,提供了更简洁的初始化方法: NSArray *items = QQ学习群:
69
接下来就要将数组的内容加到UIsegmentedControl上了。创建一个分段控件实例,并用数组的内容进行初始化。在viewDidLoad方法中添加以下代码。
1.- (void)viewDidLoad 2.{ 3. NSArray *items = 4. UISegmentedControl *segmented = [[UISegmentedControl alloc]initWithItems:items]; 5. segmented.frame = CGRectMake(60, 100, 200, 40); 6. segmented.segmentedControlStyle = UISegmentedControlStyleBar; 7. [self.view addSubview:segmented]; 8. [segmented release]; 9.} 然后在应用加载方法中添加viewDidLoad方法。 在初始化实例时,我们选择initWithItems方法,将前面定义的数组实例添加进来,这样分段控件上显示的内容就是你所定义的内容。然后我们定义了控件的外观类型,有4中类型供用户选择.比较常见的是类型是UISegmentedControlStyleBar。 QQ学习群:
70
实例创建完成之后,我们可以根据自己的喜好,对实例进行自定义的设置。比如设置分段控件实例的颜色,设置各个段的长度,设置默认选择的按钮等,还可以根据需要在特定的位置插入分段。
1.- (void)viewDidLoad 2.{ 3. NSArray *items = 4. UISegmentedControl *segmented = [[UISegmentedControl alloc]initWithItems:items]; 5. segmented.frame = CGRectMake(60, 100, 200, 40); 6. segmented.segmentedControlStyle = UISegmentedControlStyleBar; 7. [segmented setWidth:30.0f forSegmentAtIndex:1]; 8. segmented.selectedSegmentIndex = 1; 9. [segmented atIndex:2 animated:YES]; [self.view addSubview:segmented]; [segmented release]; 12.} QQ学习群:
71
我们在原有的代码的基础上,将分段中index值为1的分段的长度设置为30,将默认选择index值为1的分段,而且还添加了一个新的名为”图片”的分段放在index值为2的位置上。可以通过图查看最后的效果。 QQ学习群:
72
在最新的SDK中提到,当需要对控件设置颜色时,只有当外观形式是UISegmentedControlStyleBar或者UISegmentedControlStyleBezeled时才能设置,在其他两种形式下对颜色设置是无效的。 完成了实例的创建之后,我们就要实现相应的功能。在实际项目中,分段控件的主要功能是完成切换视图的工作,而且一般会将分段控件定义在导航栏(UINavigationBar)或者屏幕下方的UITabBar中,而这些内容我们还没有讲到,会在以后的课程中完成这个功能。在本小节的内容中我们就实现一个简单地功能,单击每个分段按钮后会提示当前的信息。 QQ学习群:
73
QQ学习群:262779381 1.#import <UIKit/UIKit.h>
ViewController : UIViewController 3.{ 4. UILabel *label; 5. UISegmentedControl *segmented; 6.} 8.- (void)viewDidLoad 9.{ label = [[UILabel alloc]initWithFrame:CGRectMake(60, 200, 240, 40)]; [self.view addSubview:label]; [label release]; NSArray *items = UISegmentedControl *segmented = [[UISegmentedControl alloc]initWithItems:items]; segmented.frame = CGRectMake(60, 100, 200, 40); segmented.segmentedControlStyle = UISegmentedControlStyleBar; [segmented setWidth:30.0f forSegmentAtIndex:1]; segmented.selectedSegmentIndex = 1; [segmented addTarget:self forControlEvents:UIControlEventValueChanged]; [segmented atIndex:2 animated:YES]; [self.view addSubview:segmented]; [segmented release]; 24.} QQ学习群:
74
25.- (void)value:(UISegmentedControl *)segmented
26.{ 27.NSString *labeltext = [[NSString 28.的是第%d个分段位置",segmented.selectedSegmentIndex + 1]; 29.label.text = labeltext; 30.[labeltext release]; 31.} segmented实例有一个selectedSegmentIndex用于获取当前选择segment的索引值,通过这个index值来执行相对应的方法。 value是一个带参数void类型的方法,将实例segmented作为参数传到方法中,这样就可在方法中调用该实例进行操作。如果声明一个带参数的方法,要注意在为实例添加动作时要在方法名后面加冒号,比如在上面的动作中: [segmented addTarget:self forControlEvents:UIControlEventValueChanged]; UIControlEventValueChanged和UIControlEventTouchUpInside事件不同之处在于前者是通过值的改变来触发事件,而后者是通过单击来触发事件。 QQ学习群:
75
在本节内容中,我们介绍了UISegmentedControl的基本属性和方法,如果在项目中需要用到UISegmentedControl控件,读者可以查阅SDK了解更多属性和方法的用法。
UIPageControl视图和UISegmentedControl视图有很多相似之处,它们的功能都是处理视图的切换。在iPhone的应用中,如果有有很多页面,在屏幕的顶端或底部会出现分页效果的视图。因为该视图在实际项目中用到的并不是很多,我们这里简单地介绍一下它的基本属性。 新建一个Single View Application项目,在ViewController.m文件中的viewDidLoad方法里创建我们的实例,并设置相关的属性。 1.- (void)viewDidLoad 2.{ 3. UIPageControl *page = [[UIPageControl alloc]initWithFrame:CGRectMake(100, 450, 100, 20)]; 4. page.numberOfPages = 3; 5. page.currentPage = 2; 6. page.backgroundColor = [UIColor grayColor]; 7. [self.view addSubview:page]; 8. [page release]; 9.} QQ学习群:
76
定义视图的方法和前面几个视图一致,然后numberOfPages属性代表了一共有多少个页面,currentPage属性代表默认情况下显示的是第几个页面。还有一个重要的属性是hidesForSinglePage,它的作用是当只有一个页面时隐藏视图,因为当只有一个视图时在使用UIPageControl视图会显得屏幕比较单调,所以系统提供了隐藏单视图视图的属性,它是一个BOOL类型,需要设置它时将值设置为YES即可。 QQ学习群:
77
5.2.4UIActivityIndicatorView
UIActivityIndicatorView视图的效果是显示载入时等待画面上进度圈,它一般会和网络编程混合使用,当从网络上下载或读取信息时,就会显示UIActivityIndicatorView视图,信息载入完成后,视图会自动消失。在本小节中,我们就来介绍UIActivityIndicatorView视图的常用属性和方法。 新建一个Single View Application项目模板,在ViewController.h文件定义一个UIActivityIndicatorView视图的实例。 1.#import <UIKit/UIKit.h> ViewController : UIViewController 3.{ 4. UIActivityIndicatorView *view; 5.} QQ学习群:
78
7.- (void)viewDidLoad { 8. [super viewDidLoad]; 9. // Do any additional setup after loading the view, typically from a nib. view = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleGray]; view.center = CGPointMake(150, 200); [view startAnimating]; [self.view addSubview:view]; 15.} QQ学习群:
79
我们在初始化UIActivityIndicatorView实例时,要注意通过CGRectMake方法去定义实例的大小是没有意义的,因为系统已经为它定义好了大小,用户是无法更改的,只能通过CGPointMake方法定义它在屏幕中位置。 UIActivityIndicatorView实例默认下是静止的,所以我们要通过调用startAnimating方法让它运动起来。 在实际操作中,我们还会发现如果在搜索网络时,UIActivityIndicatorView视图也会出现在手机屏幕上方的状态栏中,那么在设置属性时,我们只需要将UIApplication中的setNetworkActivityIndicatorVisible属性设置为YES即可。 然后我们可以通过设置一个按钮,点击之后完成信息的加载,让转动的视图隐藏。 在viewDidLoad方法中添加代码。 QQ学习群:
80
//显示网络的UIActivityIndicatorView视图
[[UIApplicationsharedApplication] setNetworkActivityIndicatorVisible:YES]; UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button forState:UIControlStateNormal]; button.frame = CGRectMake(100, 300, 100, 40); [button addTarget:self forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; - (void)hide { [[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:NO]; [view stopAnimating]; } QQ学习群:
81
构建并运行,可以看到点击按钮前后的效果如图所示。
QQ学习群:
82
5.3 UIAlertView和UIActionSheet
5.3 UIAlertView和UIActionSheet 本小节介绍的两个视图是用来提示用户选择的视图,在实际项目中也是运用的比较广泛。创建实例的方法其实很容易,重要的运用是对UIAlertViewDelegate代理方法的使用。接下来我们就通过一个例子来了解UIAlertView视图创建的方法。 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = CGRectMake(100, 200, 100, 40); [button forState:UIControlStateNormal]; [button addTarget:self forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; } QQ学习群:
83
我们先创建一个按钮实例,用于显示UIAlertView视图。然后为按钮添加一个单击事件,将按钮添加到窗口上。下面实现按钮的download方法。
- (void)download { UIAlertView *alertView = [[UIAlertView delegate:self nil]; [alertView show]; [alertView release]; } 可以看到UIAlertView视图的初始化方法非常简洁,可以设置想在弹出的警告框中显示的信息,并且可以设置多个按钮。最后通过show方法显示UIAlertView的实例。UIAlertView和UIActionSheet视图的级别非常高,在程序运行下,当显示了这两个视图时,其他的事件都被阻断了,点击其他区域是无效的。必须先完成这两个视图的事件才能继续其他的事件。 UIAlertView视图继承于UIView,所以也可以在UIAlertView上添加子视图。添加子视图的方法和其他视图的方法一致。 QQ学习群:
84
#import <UIKit/UIKit.h>
接下来重要的内容是UIAlertView的代理方法。弹出的对话框实现的效果都在代理方法中实现。要调用它的代理方法,首先要在AppDelegate.h文件中加入UIAlertViewDelegate协议。 #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UIAlertViewDelegate> @end 我们通过SDK查看它的代理方法,并实现。 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if(buttonIndex == 1){ UIAlertView *alertView = [[UIAlertView message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil]; [alertView show]; UIActivityIndicatorView *activeView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; activeView.center = CGPointMake(140,70); [activeView startAnimating]; [alertView addSubview:activeView]; [activeView release]; } QQ学习群:
85
这个代理方法的作用是当点击特定buttonIndex按钮时实现的效果。它的buttonIndex值从0,1,2……依次设定。在我们定义的alertView实例中,cancelButton的index值是0,otherButton的index值依次往下设定。 我们在代理方法中设置如果单击buttonIndex值为1的按钮时会弹出另个一UIAlertView的视图,并在视图上添加一个UIActivityIndicatorView的视图。 UIActivityIndicatorView视图的创建在上一小节中已经介绍,而添加子视图的方法和其他视图添加子视图的方法是一样的。 该例子实现了一个简单地显示UIAlertView视图和单击视图中的按钮弹出另一个视图的功能。 QQ学习群:
86
这里需要注意的是,当UIAlertView实例显示时,它是Application的第一响应者,也就是FirstReponder,只有当用户选择相应的按钮后,才可以进行其他的操作。
UIActionSheet视图和UIAlertView视图相似,也是为用户提供了选择功能,比如当想删除一个文件时,会弹出一个UIActionSheet视图提示用户是否确定删除。 QQ学习群:
87
本章小结 通过本章的学习,我们了解了IOS中各种控件的方法及使用,也知道了UIwindow和UIView之间的关系。一个IOS应用的基本控件都是由这些组成,掌握了基本使用方法后,读者需要去了解每个控件自定义方法的使用。 QQ学习群:
88
课后习题 1.使用5.1.5小节所讲layer知识,设计一个显示照片的UIView,它的外框是圆形,边框颜色为红色,阴影为黑色,并设置上一张图片。 2.仿照QQ音乐播放器,搭建基本界面。 3.在第二题的基础上,将UIAlertView和UIActionSheet集成到按钮事件中,让每个按钮都有相应的单击事件。 QQ学习群:
Similar presentations