UI:基础
App的生命周期 参考
多态的使用
//
// main.m #import <Foundation/Foundation.h>
#import "SingleDog.h"
#import "Cat.h"
#import "Animal.h"
#import "BigYellowDog.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
/*
多态:程序在运行的时候会有很多种表现形式;(不同的对象以自己的方式响应相同名称方法的能力称为多态) 条件:
必须要有继承,没有继承就没有多态。 要有方法重写(子类重写父类的同名方法); 在使用多态时,会进行动态检测,以调用真实的对象方法。 多态在代码中的体现即父类指针指向子类对象。 */ Animal *ani = [[Animal alloc] init];
[ani run]; SingleDog *sd = [[SingleDog alloc]init]; [sd run]; Cat *cat = [[Cat alloc] init];
[cat run]; //多态实现; Animal *a1 = [[SingleDog alloc]init];//父类指针 指向子类的对象;
//a1 指向内存堆区的SingleDog类的对象的地址 然后调用代码区中 SingleDog 的run方法;
[a1 run]; Animal *a2 = [[Cat alloc]init]; [a2 run];//父类动物 调用猫; SingleDog *sd1 = [[BigYellowDog alloc]init];
[sd1 run];//父类单身狗调用大黄狗; Animal *a3 = [[BigYellowDog alloc]init]; [a3 run];//父父类(爷爷类)调用大黄狗 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //刚才调用的是同名方法run方法,若调用非同名方法?
Animal *a4 = [[SingleDog alloc]init]; // [a4 eat]; //此时编译会报错,系统默认的Animal 类没有eat方法; [(SingleDog *)a4 eat];//瞒过编译 。 Animal *a5 = [[Animal alloc]init]; [(SingleDog *)a5 eat];// 这种方法能骗过编译器不会报错,但是因为Animal类对象没有eat 这种方法。程序crash;
// /* 好处:简化了程序接口,容许在类与类之间重用一些习惯性的命名,不用为新加的函数命名一个新名字。如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了。 局限性:父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。
*/ }
return ;
}
main.m
//
// Animal.h #import <Foundation/Foundation.h> @interface Animal : NSObject //爷爷类
-(void)run;
@end
person.h
//
// Animal.m #import "Animal.h" @implementation Animal
-(void)run{
NSLog(@"Animal 在跑");
}
@end
person.m
//
// SingleDog.h
// duotai #import "Animal.h" @interface SingleDog : Animal //儿子类 (动物 -》 单身狗)
-(void)eat;
@end
singleDog.h
//
// SingleDog.h
// duotai #import "Animal.h" @interface SingleDog : Animal //儿子类 (动物 -》 单身狗)
-(void)eat;
@end
singleDog.m
//
// Cat.h
// duotai
//
//
#import "Animal.h" @interface Cat : Animal //儿子类 (动物 -》猫) @end
cat.h
//
// Cat.m
// duotai #import "Cat.h" @implementation Cat
-(void)run{ NSLog(@"Cat 在跑");
}
@end
cat.m
//
// BigYellowDog.h
// duotai #import "SingleDog.h" @interface BigYellowDog : SingleDog //孙子类 (动物 -》 狗 -》 单身狗) @end
bigYellowDog.h
//
// BigYellowDog.m
// duotai #import "BigYellowDog.h" @implementation BigYellowDog
-(void)run{
NSLog(@"大黄狗在跑"); }
@end
bigYellowDog.m
mian函数的作用有三个:
1、创建应用程序的对象 UIApplication 类
2、设置应用程序的代理
3、创建事件循环 runloop (是一个死循环,实际上加了一个计时器)监视用户的交互
使用NSlog可以打印出当前的方法的名字,以及所在的行数,这对于调试很有帮助,使用方法是
NSLOG("%@",__FUNCTION__);//打印所在的方法
NSLOG("%@",__LINE__);//打印所在的行数
一个App的启动时候,在mian 函数所创的代理协议中要执行的函数如下:
//应用程序加载时候触发的方法,加载需要显示的内容
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
NSLog(@"应用程序加载 %s 方法 (应用程序加载时候触发的方法,加载需要显示的内容)所在行数 %d",__FUNCTION__,__LINE__);
// __FUNCTION__ 当前调用的方法名字
// __LINE__ 当前方法所在的行数 // cmd + k 清除控制台输出的内容
// cmd + shift + hh 显示所有的后台程序
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
} //应用程序将要取消活跃的状态的时候要触发的方法
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"应用程序加载 %s 方法 (应用程序将要取消活跃的状态的时候要触发的方法)所在行数 %d",__FUNCTION__,__LINE__);
//应用程序将要取消活跃的状态的时候要触发的方法(例如:突然有一个电话打过来,这里面可以有一个操作,保存一下数据 ) 应用程序不再处于活跃的状态
//使用该方法用来暂停正在运行的任务,然后让计时器失效,还可以让游戏暂停
} //应用程序进入后台时候触发
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"应用程序加载 %s 方法 (应用程序进入后台时候触发)所在行数 %d",__FUNCTION__,__LINE__);
//使用该方法释放共享资源,保存用户的数据,让计时器失效,存储当前的应用程序的状态(例如:用网页浏览新闻,当推出的时候,下次再打浏览器,就会回到我们当前浏览的页面)
// 如果这个应用程序支持后台运行,这个方法将会替代 applicationWillTerminate ,这个方法就会被调用 (查阅:苹果手机 墓碑机制)
} //应用程序将要进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"应用程序加载 %s 方法 (应用程序将要进入前台)所在行数 %d",__FUNCTION__,__LINE__);
//该方法用来唤醒重新进入后台时的任务 } //应用程序变成活跃状态
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"应用程序加载 %s 方法 (应用程序变成活跃状态) 所在行数 %d",__FUNCTION__,__LINE__);
//应用程序变成活跃状态(当前正在使用应用程序被暂停后 又打开)打开之后
//重启当应用程序不活跃的状态时暂停时的任务,或者开启没有启动的任务。
//如果应用程序之前处于后台的状态,可以刷新一下用户的页面 } - (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"应用程序加载 %s 方法 所在行数 %d",__FUNCTION__,__LINE__);
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
App启动的时候Appdelegate的代理方法说明
要能够会使用 :复合设计模式,就是将不同的控件组合在一个类中,然后在另一个类中可以加载这个组合在一起的组合控件,常用到登陆,注册页面的布局
UI学习
(UI控件很简单,主要是业务逻辑处理和算法要下功夫) cocaChina网站、推酷。
//didFinishLaunchingWithOptions 确实加载了
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//创建应用窗口的对象,呈现应用的内容
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];//这里加了一个autorelease
// Override point for customization after application launch. 在应用程序加载之后重写一些个性化的设置代码
//设置颜色
self.window.backgroundColor = [UIColor orangeColor];
// makeKeyAndVisible 让窗口变成程序的主窗口,并且可视
[self.window makeKeyAndVisible];//注释方法然后看UI变化,就知道这个方法了
return YES;
}
// UIView 视图类 所有在屏幕上能看到的都是他的子类或者控件
// 总结 UIView 的属性 backgroundColor 视图背景颜色
// hidden 隐藏
// alpha 透明度 取值为(0-1)默认的是 1,完全不透明
// tag 唯一的标示
// subviews 子视图 NSArray(用数组存放)
// superview 父视图 用UIview
view.hidden = YES;//隐藏中间的
view.alpha = 0.6;
view2.alpha = 0.3;
view3.alpha = 0.3;
view4.alpha = 0.3;
view5.alpha = 0.3;
//设置唯一的标示 通过 tag 可以用父视图的 viewWithTag 来找到这个被标示的视图 一般设为大于100
view.tag = 101;
UIView * aview = [self.window viewWithTag:101];
NSLog(@"%@ %@",view,aview);//打印视图信息
aview.hidden = NO;//不隐藏,就是显示
//window 的子视图
NSArray * views = [self.window subviews];
for (UIView * view in views) {
NSLog(@"%@",view);
}
//子视图
NSArray * viewArr = self.window.subviews;
NSLog(@"子视图有:%@",viewArr);
// superview 找视图的父视图
UIView * superView = view.superview;
NSLog(@"%@",superView);
/**/------注释
//创建一个绿色视图(50 50 100 50 )设置 tag 值,透明度为 0.6
UIView * greenView = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 50)];
greenView.tag = 102;
greenView.backgroundColor = [UIColor greenColor];
greenView.alpha = 0.6;
// UIView * findGreen = [self.window viewWithTag:102];//如果这里注释掉,运行后找不到此视图?????待解决
[self.window addSubview:greenView];
greenView.alpha = 0.6;
[greenView autorelease];
//Frame 相对于父视图的位置,大小。
//bounds 一个视图的边界的大小 相对于自身的坐标的位置
//获取 greenView 的 frame
NSString * frame = NSStringFromCGRect(greenView.frame);
NSLog(@"%@",frame);
NSString * point = NSStringFromCGPoint(greenView.frame.origin);
NSLog(@"%@",point);
CGFloat width = greenView.frame.size.width;
CGFloat height = greenView.frame.size.height;
NSLog(@"长度:%.f 宽度:%.f",width,height);
[greenView autorelease];
/**/
//创建新视图 newView
UIView * newView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 150, 150)];
newView.backgroundColor = [UIColor redColor];
//如果改变一个视图的位置,影响的是一个视图相对于父视图的位置和大小,是参考于父视图的坐标体系去设置视图的 坐标和大小
//改变视图的 frame (已经设置 有改变 就是相对于父视图的位置与大小
// newView.frame = CGRectMake(20, 20, 50, 50);
//bounds 边界 相对于自身的坐标的位置 (也是一个结构体)
//改变 bounds 影响他子视图的大小 和 位置
//改变 bounds (后面的宽高,相当于对视图进行缩放、改变前面的 x y 影响自身的子视图)<注意这里是重点,我觉得的的重点,多多的看几遍>
newView.bounds = CGRectMake(50, 50, 150, 150);//他不会改变相对于父亲视图的大小,只会改变(自身的坐标体系)自己的坐标原点
//newView 上添加一个子视图(注意 子视图 坐标是相对于 newview的)
UIView * vie = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
vie.backgroundColor = [UIColor greenColor];
[newView addSubview:vie];
[self.window addSubview:newView];
//视图的属性 与视图的层级管理
//创建新视图 newView
UIView * newView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 150, 150)];
newView.backgroundColor = [UIColor redColor];
//如果改变一个视图的位置,影响的是一个视图相对于父视图的位置和大小,是参考于父视图的坐标体系去设置视图的 坐标和大小
//改变视图的 frame (已经设置 有改变 就是相对于父视图的位置与大小
// newView.frame = CGRectMake(20, 20, 50, 50);
//bounds 边界 相对于自身的坐标的位置 (也是一个结构体)
//改变 bounds 影响他子视图的大小 和 位置
//改变 bounds (后面的宽高,相当于对视图进行缩放、改变前面的 x y 影响自身的子视图)
NSLog(@"改变 bounds 之前中心点坐标:%@",NSStringFromCGPoint(newView.center));
newView.bounds = CGRectMake(50, 50, 150, 150);//他不会改变相对于父亲视图的大小(就是自身的中心点不会改变),只会改变(自身的坐标体系)自己的坐标原点,后面的两个值是管着自身的大小,就是缩放的效果
//newView 上添加一个子视图(注意 子视图 坐标是相对于 newview的)
UIView * vie = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
vie.backgroundColor = [UIColor greenColor];
[newView addSubview:vie];
[self.window addSubview:newView];
[newView autorelease];
[vie autorelease];
//管理视图的层级关系
// [self.window bringSubviewToFront:uiView2];//uiView2 放到最上面
// [self.window sendSubviewToBack:uiView2];//uiView2 放到最下面
//对于一个视图来说,他只有一个父视图,但是他可以有多个子视图,子视图永远在父视图的上面
//对于一个子视图(subViews)中元素的位置和子视图添加的顺序一致,越晚放的视图就在数组的越后边,但是在显示的时候是先添加的最后显示,最后添加的先显示
//晚添加的视图如果和之前的视图有重叠的部分,会覆盖掉之前的(有重叠的内容)
//管理视图的层级关系,需要父视图(不管是添加视图:(addSubview) 还是管理层级(bringSubviewToFront sendSubviewToBack))
//如果需要把一个视图从父亲的视图上移走的话。需要 用子视图调用 removeFromSuperview方法即可
//如果想要交换两个视图的位置 exchangeSubviewAtIndex: withSubviewAtIndex:
[self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
[uiView3 removeFromSuperview];
//插入子视图在对应的下标的位置
UIView * newV = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];
newV.backgroundColor = [UIColor redColor];
[newV autorelease];
//在创建了图层之后,我们释放了之后,还可以使用是因为在 addSubview 时候 会把他的引用计数器加1 ,self.window 以 NSArray 的形式管理子视图
//插入图层(insertSubview:newV atIndex:2 ; insertSubview:uiView2 aboveSubview:newV ; insertSubview:uiView2 belowSubview:newV)
//在 window 子图层,在下标为 2 的地方 插入一个图层 newV
[self.window insertSubview:newV atIndex:2];
//在一个确定的视图上面插入一个视图
//在视图 newV 上面插入 视图 uiView2
[self.window insertSubview:uiView2 aboveSubview:newV];
//在视图 newV 下面插入 视图 uiView2
[self.window insertSubview:uiView2 belowSubview:newV];
UI:基础的更多相关文章
- 转发-UI基础教程 – 原生App切图的那些事儿
UI基础教程 – 原生App切图的那些事儿 转发:http://www.shejidaren.com/app-ui-cut-and-slice.html 移动APP切图是UI设计必须学会的一项技能,切 ...
- Android UI基础之五大布局
Android UI基础之五大布局 Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Andro ...
- iOS开发UI基础—手写控件,frame,center和bounds属性
iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...
- Android UI基础教程 目录
从csdn下载了这本英文版的书之后,又去京东搞了一个中文目录下来.对照着看. 话说,这本书绝对超值.有money的童鞋看完英文版记得去买中文版的~~ Android UI基础教程完整英文版 pdf+源 ...
- UI基础UIButton
UI基础UIButton 前面写了UIWindow.UIViewController,那些都是一些框架,框架需要填充上具体的view才能组成我们的应用,移动应用开发中UI占了很大一部分,最基础的UI实 ...
- UI基础UIWindow、UIView
UI基础UIWindow.UIView 在PC中,应用程序多是使用视窗的形式显示内容,手机应用也不例外,手机应用中要在屏幕上显示内容首先要创建一个窗口承载内容,iOS应用中使用UIWindow.UIV ...
- IOS开发UI基础--数据刷新
IOS开发UI基础--数据刷新 cell的数据刷新包括下面几个方面 加入数据 删除数据 更改数据 全局刷新方法(最经常使用) [self.tableView reloadData]; // 屏幕上的全 ...
- Android 的UI基础布局的学习
一. 今天学习了Android 的UI基础布局的部分,绝大多数的布局都在Androidstudio的这个界面里,如下: 在左边的框里的palette的内部,包含了的大多数的布局所要用的button按钮 ...
- IOS开发UI基础UIView
主要介绍下UIView得基本概念和一些属性的介绍至于属性的用户后面会由详细的介绍 -.UIView基本概念 1.什么是控件? 屏幕上所有的UI元素都叫做控件 (也有很多书中叫做视图 组件) 比如 按钮 ...
- IOS的UI基础01
内容大纲:(红色表示博主个人重点记忆) 1.指定启动界面 带箭头就是首次启动的页面2.两个常用的快捷键3.拖线子控件注意事项4.一般情况下,UIView的容器是控制器的View.5.didRecive ...
随机推荐
- HDU5463 Clarke and minecraft
解题思路:此题刚开始,觉得好繁琐,好混乱,理清思路后,发现很简单. 具体见代码分析. #include<cstdio> #include<cstring> #include ...
- [转载] FFMpeg的码率控制
mediaxyz是一位研究ffmpeg有三年的高人了,这几天一直在折腾ffmpeg中的x264,就是不知道该如何控制码率,主要是参数太多,也不知道该如何设置,在google上search了一下,这方面 ...
- [转]Linux read用法
来源:http://www.cnblogs.com/iloveyoucc/archive/2012/04/16/2451328.html 1.基本读取 read命令接收标准输入(键盘)的输入,或其他文 ...
- SQL Server数据类型与SDE库表sde_type对照表
SDE_column_registry 表管理所有注册列. 警告:如果使用 SQL 界面更改列定义,SDE_column_registry 表中的记录将不会更新.这可能导致之后的任何数据导出失败. S ...
- 开发者必读jQuery Mobile入门教程
你每天都会对着它讲话,和它玩游戏,用它看新闻——没错,它就是你裤兜里的智能手机.android,黑莓还是iphone?为了让你清楚意识到究竟哪些才算是智能手机,我在下面总结了一个智能手机系统/设备的列 ...
- POJ 2241 Mondriaan's Dream
题意:给一块n×m的空地,用1×2的砖铺,有多少种方案. 解法:状压dp.考虑dp[i][j]表示前i - 1行都铺满时第i行的状态为j时的方案数.对于第i行,每个格子上是否有砖用0和1表示,0表示不 ...
- Docker 基础技术:Linux Namespace(下)
导读 在Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中 ...
- WPF:百度百科
WPF http://baike.baidu.com/view/292311.htm
- 360网站卫士推出google字体加速方案
最近,有网友反映称谷歌官网域名google.com.谷歌香港google.com.hk都打不开, ping了一下google.com和google.com.hk两个域名的服务器情况,最后ping出来的 ...
- java 学习资料
最近一直在从java基础开始学习java,感觉个人学习思路还是比较混乱的. 看到Java工程师成神之路中介绍了需要学习的知识点,并在<成神之路系列文章>中分章分节的开始介绍其中所有的知识点 ...