view 上的控件个数
self.view.subviews
subview NSArray
subview[]
对frame的值进行更改
// 1.先取出frame
//CGRect tempFrame = _btn.frame;
2.改变temp的值
// 3.重新赋值按钮的frame
形变属性transform
// 清空之前所有的形变状态(消除以前的旋转、缩放等状态)
// _btn.transform = CGAffineTransformIdentity;
设置文字字体
// 设置字体
field.font = [UIFont systemFontOfSize:30];
获取文件的全路径
- (void)viewDidLoad
{
[super viewDidLoad];
// 1.获得所有的描述(通过解析plist文件来创建数组对象,比如传入文件的全路径)
// 如果要访问项目中资源包里面的所有资源。应该用mainBundle
NSBundle *bundle = [NSBundle mainBundle];
// 获得文件的全路径
NSString *path = [bundle pathForResource:@"descs" ofType:@"plist"];
// 加载path对应的文件来创建数组
_allDescs = [NSArray arrayWithContentsOfFile:path];
// 2.设置默认的描述
_imageDesc.text = _allDescs[0];
}
button 和image view的区别
/*
1.显示图片
1> UIImageView只能一种图片(图片默认会填充整个UIImageView) image\setImage:
2> UIButton能显示2种图片
* 背景 (背景会填充整个UIButton) setBackroungImage:forState:
* 前置(覆盖在背景上面的图片,按照之前的尺寸显示) setImage:forState:
* 还能显示文字 前置图片放左边 文字放右边 没文字 居中显示
2.点击事件
1> UIImageView默认是不能响应点击事件
2> UIButton能响应点击事件 : addTarget:action:forControlEvents:
3.使用场合
1> UIImageView : 只显示图片,不监听点击,点击了图片后不做任何反应
2> UIButton : 既显示图片,又监听点击,点击了图片后做一些其他事情
4.继承结构
1> UIButton之所以能添加监听器来监听事件,是因为它继承自UIControl
2> UIImagevIew之所以不能添加监听器来监听事件,是因为它直接继承自UIView
*/
图片加载的2种方法和区别
// 加载图片(缓存)
// UIImage *img = [UIImage imageNamed:name];
// 没有缓存
UIImage *img = [[UIImage alloc] initWithContentsOfFile:path];
用文件路径添加东西
// 1.创建可变数组
NSMutableArray *images = [NSMutableArray array];
// 2.添加图片
for (int i = 0; i<count; i++) {
// 图片名
NSString *name = [NSString stringWithFormat:@"%@_%02d.jpg", filename, i];
// 全路径
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:nil];
// 加载图片(缓存)
// UIImage *img = [UIImage imageNamed:name];
// 没有缓存
UIImage *img = [[UIImage alloc] initWithContentsOfFile:path];
[images addObject:img];
}
// 3.设置动画图片(有顺序)
_tom.animationImages = images;// 序列帧动画
// 4.只播放一次
_tom.animationRepeatCount = 1;
// 5.设置动画的持续时间
_tom.animationDuration = 0.1 * count;
// 5.开始动画
[_tom startAnimating];
获取路径加载字典的内容
// 1.获得tom.plist的全路径
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"tom" ofType:@"plist"];
// 2.根据文件路径加载字典
_dict = [NSDictionary dictionaryWithContentsOfFile:path];
// 3.获得图片数量
int count = [_dict[title] intValue];
// 0.取出最后一个子控件
UIView *last = [self.view.subviews lastObject];
setimage setbackgroundimage
原来的尺寸 填充整个框
随机整数
int ramdom = arc4random_uniform(9);
//int ramdom1 = arc4random();
uiview常见方法
1.addSubview:(UIView *)child
添加子控件
2.NSArray *subViews
通过addSubview的方法添加的子控件都会存在于这个数组中
3.removeFromSuperview
将控件本身从父控件中移除
4(UIView*)viewWithTag: (int)matag
返回tag值为mytag的子控件
如果有多个子控件tag一样,只会返回第一个匹配的子控件
5.UIView *superview
父控件
storyboard
描述软件界面,大范围,重量级,比较适合描述整个软件的所有界面
xib
描述软件界面,小范围,轻量级,比较适合描述某个小界面
//隐藏上面的时间栏
-(BOOL)prefersStatusBarHidden
{
return YES;
}
MVC小结
/*
1.读取文件路径
2.用路径创建数组
3.创建可变数组用于将可变数组变成模型数组
4.遍历路径数组
5.将路径数组的元素放到模型数组中去
6.将模型数组放到可变数组中
7.可变数组赋值给原数组
*/
1.UISwitch
* UISwitch继承自UIControl,因此也能像UIButton一样监听一些事件,比如状态改变事件
* UISwitch可以通过拖线监听状态改变
* UISwitch可以通过addTarget:...方法监听状态改变
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
// 其中controlEvents参数传递的是:UIControlEventValueChanged(值改变事件)
2.监听文本框的文字改变
* 一个文本输入框的文字发生改变时,文本输入框会发出一个UITextFieldTextDidChangeNotification通知
* 因此通过监听通知来监听文本输入框的文字改变
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:textField];
// textField文本输入框的文字改变了,就会调用self的textChange方法
创建一个实例方法一个类方法
+ (instancetype)heroWithDict:(NSDictionary *)dict;
- (instancetype)initWithDict:(NSDictionary *)dict;
- (NSArray *)heros
{
if (_heros ==nil) {
// 初始化
// 1.获得plist的全路径
NSString *path = [[NSBundlemainBundle]pathForResource:@"heros.plist"ofType:nil];
// 2.加载数组
NSArray *dictArray = [NSArrayarrayWithContentsOfFile:path];
// 3.将dictArray里面的所有字典转成模型对象,放到新的数组中
NSMutableArray *heroArray = [NSMutableArrayarray];
for (NSDictionary *dictin dictArray) {
// 3.1.创建模型对象
MJHero *hero = [MJHeroheroWithDict:dict];
// 3.2.添加模型对象到数组中
[heroArray addObject:hero];
}
// 4.赋值
_heros = heroArray;
}
return_heros;
}
模型嵌套模型
/*
一个字典有多个数组
1.将字典单元素的成员拿出取值
2.将字典多元素的成员赋值给数组
3.创建可变数组
4.遍历字典把多元素成员赋值给模型
1.小数组封装成模型
5.将模型放到可变数组
+(instancetype)CarWithDic:(NSDictionary *)dic
{
return [[selfalloc]initWithDic:dic];
}
-(instancetype)initWithDic:(NSDictionary *)dic
{
if (self = [superinit] ) {
[selfsetValuesForKeysWithDictionary:dic];
}
returnself;
}
*/
-(instancetype)initWithDic:(NSDictionary *)dic
{
if (self = [superinit]) {
self.title = dic[@"title"];
NSArray *carArr = dic[@"cars"];
NSMutableArray *modelCar = [NSMutableArrayarray ];
for (NSDictionary *dicin carArr) {
//创建一个car模型存放原数组的元素
Car *c = [CarCarWithDic:dic];
[modelCar addObject:c];
}
self.cars = modelCar;
}
returnself;
}
1.UISwitch
* UISwitch继承自UIControl,因此也能像UIButton一样监听一些事件,比如状态改变事件
* UISwitch可以通过拖线监听状态改变
* UISwitch可以通过addTarget:...方法监听状态改变
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
// 其中controlEvents参数传递的是:UIControlEventValueChanged(值改变事件)
2.监听文本框的文字改变
* 一个文本输入框的文字发生改变时,文本输入框会发出一个UITextFieldTextDidChangeNotification通知
* 因此通过监听通知来监听文本输入框的文字改变
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:textField];
// textField文本输入框的文字改变了,就会调用self的textChange方法
2.UIView自带的方法
1> - (void)layoutSubviews;
* 当一个控件的frame发生改变的时候就会自动调用
* 一般在这里布局内部的子控件(设置子控件的frame)
* 一定要调用super的layoutSubviews方法
2> - (void)didMoveToSuperview;
* 当一个控件被添加到父控件中就会调用
3> - (void)willMoveToSuperview:(UIView *)newSuperview;
* 当一个控件即将被添加到父控件中会调用
一.UIPickerView
1.UIPickerView的常见属性
// 数据源(用来告诉UIPickerView有多少列多少行)
@property(nonatomic,assign)id<UIPickerViewDataSource> dataSource;
// 代理(用来告诉UIPickerView每1列的每1行显示什么内容,监听UIPickerView的选择)
@property(nonatomic,assign)id<UIPickerViewDelegate> delegate;
// 是否要显示选中的指示器
@property(nonatomic) BOOL showsSelectionIndicator;
// 一共有多少列
@property(nonatomic,readonly) NSInteger numberOfComponents;
2.UIPickerView的常见方法
// 重新刷新所有列
- (void)reloadAllComponents;
// 重新刷新第component列
- (void)reloadComponent:(NSInteger)component;
// 主动选中第component列的第row行
- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated;
// 获得第component列的当前选中的行号
- (NSInteger)selectedRowInComponent:(NSInteger)component;
3.数据源方法(UIPickerViewDataSource)
// 一共有多少列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
// 第component列一共有多少行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
4.代理方法(UIPickerViewDelegate)
// 第component列的宽度是多少
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;
// 第component列的行高是多少
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;
// 第component列第row行显示什么文字
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
// 第component列第row行显示怎样的view(内容)
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view;
// 选中了pickerView的第component列第row行
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;
二.UIDatePicker
1.常见属性
// datePicker的显示模式
@property (nonatomic) UIDatePickerMode datePickerMode;
// 显示的区域语言
@property (nonatomic,retain) NSLocale *locale;
2.监听UIDatePicker的选择
* 因为UIDatePicker继承自UIControl,所以通过addTarget:...监听
三.程序启动的完整过程
1.main函数
2.UIApplicationMain
* 创建UIApplication对象
* 创建UIApplication的delegate对象
3.delegate对象开始处理(监听)系统事件(没有storyboard)
* 程序启动完毕的时候,就会调用代理的application:didFinishLaunchingWithOptions:方法
* 在application:didFinishLaunchingWithOptions:中创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)
* 创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
1.UIWindow
* 主窗口的概念
* 新建UIWindow
2.UIViewController
* 控制器的创建方式
* 控制器view的创建方式
* view的懒加载
* loadView、viewDidLoad、viewDidUnload、didReceiveMemoryWarning
3.UINavigationController
* 通过“设置”演示基本用途
* 通过非storyboard方式,感受导航的作用
1> 创建导航控制器
2> 设置UIWindow的根控制器
3> push 1个、2个、3个子控制器
4> 解释push的原理(栈、导航控制器的管理过程)
5> 栈底、栈顶控制器的概念
6> 如何设置导航栏上面的内容、返回文字的设置
7> pop的方法使用
8> push和addChild、viewControllers和childViewController的关系
* 通过storyboard方式,感受导航的作用
4.UIViewController的生命周期方法、AppDelegate的生命周期方法
1.tableView的刷新
1> 数据刷新的总体步骤
* 修改模型数据
* 刷新表格(刷新界面)
2> 刷新表格(刷新界面)的方法
* 全局刷新(每一行都会重新刷新)
- (void)reloadData;
* 局部刷新(使用前提:刷新前后,模型数据的个数不变)
- (void)reloadRows:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
* 局部删除(使用前提:模型数据减少的个数 == indexPaths的长度)
- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
2.@property属性的用法
* weak(assign) : 代理\UI控件
* strong(retain) : 其他对象(除代理\UI控件\字符串以外的对象)
* copy : 字符串
* assign : 非对象类型(基本数据类型int\float\BOOL\枚举\结构体)
1.Xcode自带头文件的路径
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk/System/Library/Frameworks/UIKit.framework/Headers
2.修改了系统自带头文件后,Xcode会报错
解决方案:删掉下面文件夹的缓存即可(aplle是电脑的用户名)
/Users/aplle/资源库/Developer/Xcode/DerivedData
或者
/Users/aplle/Library/Developer/Xcode/DerivedData
3.使用xib封装一个自定义view的步骤
1> 新建一个继承UIView的自定义view,假设类名叫做(MJAppView)
2> 新建一个MJAppView.xib文件来描述MJAppView内部的结构
3> 修改UIView的类型为MJAppView真是类型
4> 将内部的子控件跟MJAppView进行属性连线
5> MJAppView提供一个模型属性
6> 重写模型属性的set方法,因为在set方法中可以拿到外界传递的模型数据
7> 把模型数据拆开,分别设置数据到对应的子控件中
8> 补充:提供一个创建MJAppView的类方法,将读取xib文件的代码屏蔽起来
NSURL *url = [NSURL fileURLWithPath:appFile]; self.videoMPPlayer =[[MPMoviePlayerController alloc] initWithContentURL:url];
self.videoMPPlayer.view.frame = CGRectMake(0, 0, 320, 480);
self.videoMPPlayer.scalingMode = MPMovieScalingModeAspectFill;
self.videoMPPlayer.controlStyle = MPMovieControlStyleNone;
// Register for the playback finished notification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieLoadStateChanges:) name:MPMoviePlayerLoadStateDidChangeNotification object:videoMPPlayer];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:videoMPPlayer];
typeof(self) 是获取到self的类型,这样定义出的weakSelf就是和self一个类型的, 加上__weak是建立一个若引用,整句就是给self定义了一个若引用性质的替身;
这个一般用在使用block时会用到,因为block会copy它内部的变量,可能会造成引用循环,使用__weak性质的self替代self,可以切断block对self的引用,避免循环引用
MJSettingItem *viewMsg = [MJSettingArrowItem itemWithIcon:@"MoreMessage" title:@"查看消息" destVcClass:nil];
__weak typeof(self) selfVc = self;
viewMsg.option = ^{
NSLog(@"%@", selfVc.tableView.subviews);
};