点滴积累

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文本输入框的文字改变了,就会调用selftextChange方法

 创建一个实例方法一个类方法

+ (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文本输入框的文字改变了,就会调用selftextChange方法



2.UIView自带的方法

1> - (void)layoutSubviews;

* 当一个控件的frame发生改变的时候就会自动调用

* 一般在这里布局内部的子控件(设置子控件的frame)

* 一定要调用superlayoutSubviews方法


2> - (void)didMoveToSuperview;

* 当一个控件被添加到父控件中就会调用


3> - (void)willMoveToSuperview:(UIView *)newSuperview;

* 当一个控件即将被添加到父控件中会调用


.UIPickerView

1.UIPickerView的常见属性

// 数据源(用来告诉UIPickerView有多少列多少行)

@property(nonatomic,assign)id<UIPickerViewDataSource> dataSource;

// 代理(用来告诉UIPickerView1列的每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对象

* 创建UIApplicationdelegate对象


3.delegate对象开始处理(监听)系统事件(没有storyboard)

* 程序启动完毕的时候,就会调用代理的application:didFinishLaunchingWithOptions:方法

* application:didFinishLaunchingWithOptions:中创建UIWindow

* 创建和设置UIWindowrootViewController

* 显示窗口


3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(storyboard)

* 创建UIWindow

* 创建和设置UIWindowrootViewController

* 显示窗口

1.UIWindow

* 主窗口的概念

* 新建UIWindow


2.UIViewController

* 控制器的创建方式

* 控制器view的创建方式

* view的懒加载

* loadViewviewDidLoadviewDidUnloaddidReceiveMemoryWarning


3.UINavigationController

* 通过设置演示基本用途

* 通过非storyboard方式,感受导航的作用

1> 创建导航控制器

2> 设置UIWindow的根控制器

3> push 1个、2个、3子控制器

4> 解释push的原理(栈、导航控制器的管理过程)

5> 栈底、栈顶控制器的概念

6> 如何设置导航栏上面的内容、返回文字的设置

7> pop的方法使用

8> pushaddChildviewControllerschildViewController的关系


* 通过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];



•iOS6导航栏背景的出图规格
Ø非retina:320x 44 px
Øretina:640x 88 px
•iOS7导航栏背景的出图规格
Øretina:640x 128 px


    typeof(self) 是获取到self的类型,这样定义出的weakSelf就是和self一个类型的, 加上__weak是建立一个若引用,整句就是给self定义了一个若引用性质的替身;

    这个一般用在使用block时会用到,因为blockcopy它内部的变量,可能会造成引用循环,使用__weak性质的self替代self,可以切断blockself的引用,避免循环引用

   

    MJSettingItem *viewMsg = [MJSettingArrowItem itemWithIcon:@"MoreMessage" title:@"查看消息" destVcClass:nil];

    

    __weak typeof(self) selfVc = self;

    viewMsg.option = ^{

        NSLog(@"%@", selfVc.tableView.subviews);

    };

    

    


   

    

    

    

    

    

    



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值