ios第2天

tittle button
backgroundRectForBounds
tittleRectForContentRect控制器内部label的frame
imageRectForContentRect// 控制器内部imageView的frame

CGFloat
CGFloat
CGRectMake

点击一个按钮,才报错,死循环!!
awakeFromNib
从文件中解析一个对象时会调用



软件开发定律:万物皆对象
UIKit:创建和管理应用程序用户界面
图片对象:UIImageView
文本标签对象:UILabel
按钮对象:UIButton

利用UIKit框架提供的类来创建各种可视化组建对象,最后组成复杂而美观的UI界面
提高学习效率:
    1.理解思路,寻找规律。
    2.下课敲代码不要看代码。
    3.学习是学问题,不是学答案,学会发现问题,解决问题

一个简单地加法计算器:
stroyboard文件:描述界面,左边的箭头所指的界面:程序—启动就会显示
option键,拖
改成数字键盘:attribute  keyboardtype
拖线实现按钮单击事件:
能点的都是按钮!
能输入文字的是文本框!

UIView所有控件的祖先(控件,组建) :作用 1.展示控件;2. 采集控件
UIButton, UILabel, UITextField
每一个UIView都是一个容器,能容纳其他UIView
UIViewController 作用:
首先创建一个UIViewController, 接着, 创建一个大的UIView
Controller与View的关系:view如何创建, 如何销毁, 子控件的一些触发事件, 这一切有controller来实现。一句话, controller用来管理view的,包括UIview的创建销毁,UIView与用户的交互


监听事件在控制器的类中写代码

类扩展
IBAction表示void,但表示能拖线(关联)了
连线,删线

获得文本框中的内容:
拖!!!
controller中的属性与界面上的控件相关连 outlet (生成属性) action生成方法

实现计算功能步骤
!. 获取用户的输入
计算和
把结果显示在界面上

字符串类型转成int
int n1 = [num1 intValue];
int n1  = num2.intValue;
int -> NSString:
[NSString stringWithFormat:@“@%d”, result];

收回键盘操作
firstResponsor第一响应者:键盘是谁叫出来的, 那个谁就叫做第一响应者
1.让第一响应者辞职,键盘就缩回去了.  用[num1resignFirstResponder]方法。
2.找到当前控制器控制的view, 让其内部所有的控件停止编辑工作。这样的话,凡是这个view的子控件叫出的键盘就都会去了。[self.view endEditing YES]

self表示当前的viewController, self.view表示当前控制器所管理的那个view

IBAction IBOutlet 相当于void,但能让我们拖线

子控件, 父控件   是容器与其内部控件的关系


Deployment Target:  当前开发的最低运行版本

Main Interface: 程序启动时启动哪个storyboard

Bundle Identifier: 版本

箭头: 程序启动时启动的控制器, (如果没看到箭头勾选is initial viewControllor)

程序启动->配置Main.storyboard->箭头所指向的controller-> 配置的类名-> 创建controller ->创建view
文本框: placeholder(用户输入文字是会自动消失) secure(密码文本框掩码显示)
文本框右边显示“清楚”按钮。Clear Button默认值:Never appears
文本框只能输入数字:keyboard属性

按钮:能显示文字,图片,还能随时调整内部图片和文字的位置
有UIKIt提供

功能分析:
左下角4个方向按钮,控制头像的位置
右下角分别是放大,缩小按钮,控制头像的尺寸
头像按钮既要有背景图片,又有文字

步骤分析:
搭建UI界面
监听按钮点击
修改头像按钮的属性来调整位置和尺寸

拖图片到images.xcassets
按钮的状态:高亮,默认状态
按钮默认类型是system, 其高亮状态是灰色。
    可以改成custom类型。


拖线:方法2:右击控件,选择事件,连线到代码的扩展中

获取button的坐标:获取原始按钮的frame值(是CGRect的类型,包扩两个值:point and size, 其中point包扩CGFloat x, CGFloat y, size 包括width, 与height);
CGRect orignFrame = self.btnIcon.frame; //获得图标的frame
originFrame.origin.y -= 10;// 设置y值
self.btnIcon.frame = originFrame;// 把新的frame在赋值给按钮

修改控件坐标步骤:
获取原始的frame值
修改frame
重新把新的frame值赋值给控件

当oc对象属性是一个结构体类型, 不能直接修改该属性的值,规定的

创建size: CGSizeMake()   创建Rect  CGRectMake

sender当前所被点的那个按钮当作参数

任何的控件都有一个tag属性来标记该控件,
使用sender.tag来判断用户当前点击是那个按钮

获取原始的frame
修改frame
把修改后的值传给原始的frame

frame(包含位置和大小x, y表示左上角的坐标)CGRect
center(只能修改位置,表示的是控件中心点的坐标)CGSize
bounds(修改大小)CGRect
transform(旋转)


NSStringFromCGRect();

增加动画两种方式
1.头尾式
  1).开启动画
    [UIView beginAnimations:nil context:nil];
  2).设置动画执行时间
           [UIView setAnimationDuration:2];
————中间这里是要执行的动画的代码----------------
 3).提交动画
    [UIView commitAnimations]
2.Block式
 1).[UIView animateWithDuration:持续时间 animations:^{
    self.btnIcon.frame = orignFrame;    
}];

当要显示一个界面的时候,首先创建这个界面对应的控制器,控制器创建好以后,接着创建控制器所管理的那个view,当这个view加载完毕以后就开始执行下面的方法了。
所以只要viewDidLoad方法被执行了,就表示控制器所管理的view创建好了

动态创建我们自已的按钮
1.创建按钮  UIButton *button= [[UIButton alloc]init]
设置按钮上显示的文字﹕[button setTitle:@“点我吧” forState:UIControlStateNormal]   默认状态下的显示文字
       [button setTitle:@“摸我干啥” forState:UIControlStateHighlighted];

设置默认状态下的背景图片
UIImage *imgNormal = [UIImage imageNamed:@“   “];

    [button setBackgroundImage:imgNormal forState: UIControlStateNormal];
设置高亮状态下的背景图片
    [button setBackgroundImage:imgHighlighted forState:UIControlStateHighlighted];
设置不同状态下的文字颜色
[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted]
设置按钮的frame
   button.frame=CGRectMake(50, 100, 100, 100);
把动态创建的按钮加到控制器所管理的那个view中
       [self.view addSubview:button]添加一个字控件
    [self.view removeFromSuperview;]从父控件中移除
通过代码为按钮注册一个单击事件
[button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];

去除autolayout
1.如果发现通过代码无法修改控件的位置或者尺寸时,应该去掉storyboard里面的autolayout功能,这是自ios6开始出现的特性
2.顾名思义,autolayout是用来自动布局的,用来束䌸控件的位置和尺寸,去掉这个功能,控件的位置和尺寸就不再有一些固定的束䌸



PNG 格式的图片格式可以省略


transform属性可以修改控件的位移,缩放,旋转
创建一个transform属性
CGAffineTransform CGAffineTransformMakeTransaltion(CGFloat tx, CGFloat ty)  // 平移
CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy); // 缩放
CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)
//旋转
在某个transform的基础上进行叠加
CGAffineTransform CGAffineTransformTranslate(CGaffineTransform t, CGFloat tx, CGFloat ty);
CGAffineTransform CGAffineTransformScale(CgAffineTransform t, CgFloat sx, CgFloat sy);
CGAffineTransform CGAffineTransformRotate(CGAffineTransform t, CGFloat angle);

清空之 前设置的transform属性
view.transform = CGAffineTransformIdentity;


@property(nonatomic, readonly) UIView *superview; 获得自已的父控件对鲁人
*subview: 获得自已的子控件

self.view.subviews  获得该控件的所有字控件。

根据tag来获取某个控件
[self.view view WithTag:1000]

图片用图片框﹕什么都不要,只要文件框

plist,文件,保存;数据的文件  在Resource -> Property List里创建


Dictionary可以保存多个值


写代码加载pic.plist文件中的数据到_pic
获取pic.plist文件的一段话径
    // 获取pic.plist文件的路径赋值给path变量
    // [NSBundle mainBundle]表示获取这个app安装到手机上时的根目录,然后在app的安装的根目录下搜索pic.plist文件的路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@“pic.plist” ofType:nil]
    NSString *path =[[NSBundle mainBundle]pathForResource:@“pic” ofType:@“plist”];两种方式都可以

    
    NSArray *array = [NsArray arrayWithContentsOfFile:path];读取该路径的文件


写一个索引来控制当前显示的是第几张图片
1.让索引++
    self++
从数组中获取当前这张图片的数据
     NSDictionary *dic = self.pic[self.index];
3 把获取到的数据设置给界面上的控件
    self.lblIndex.text = [NSString stringWithFormat:@“%d/%ld”, self.index, self.pic.count];
    self.imgViewIcon.image = [UIImage imageNamed:dict[@“icon"]]通过image属性来设置图片框里面的图片//
    self.liblTitle.text = dict[@“title”];
懒加载数据

    控制上一张与下一张是否可用


如何新建plist文件
NSDictionary赋值:
NSDictionary *dict1 = @{@“name”: @“liliy”, @“age”: @18, @“height”: @189};
NSArray *students = @[dict1, dict2, dict3];
NSLog(@“%@“, students); ;输出
再新建好的那个plist(空的)的路径

plist本质上是一个xml文件




UIImageView帧动画相关属性﹕
@property(nonatomic, copy) NSArray* animationImages;
  需要播放的序列帧图片()里面都是UIImage对鲁人,会按序显示里面的图片

@property(nonatomic) NSTimeInterval animatonDuration;
帧动画的持续时间
@property(nonatomic) NSInteger animationRepeatCount;
帧动画的执行次数(默认是无限循环)
-(void)start|Animating;
开始执行帧动画

-(void)stopAnimating;
停止执行帧动画
-(Bool)isAnimating;
是否正在执行帧动画


1动态加载图片到一个NSArray中

     加载一张图片到内存中
    UIImage *img = [UIImage imageNamed:@“drink_00.jpg"]
2设置UIImageView(图片框)的animationImages属性,这个属性中包含的就是所有那些要执行动画的图片
3设置动画持续时间
4设置动画是否需要壬富士复播放
5开启动画
    

%02d 保留两位


通过[UIImage imagenamed:imgName]程序会缓存,不会释放内存,图片会一直保存在内存中,这样下次如果再使用同样的图片的时候就不需要再重新加载了最新版因为内存里面已经有了。缺点就是﹕如果加载了大量的图片,那么这些图片会一直保留在内存中,导致应用程序占用内存过大(这就叫缓存)
解决方法
UIImage *imgCat = [UIImage imageWithContentsFile:完整的路经]

如何获取完整的路径﹕
NSString *path = [NSBundle mainBundle] pathForResource: imgName ofType: nil]这样就获得到完的路径

用完图片后,清除在内存中的图片
[self.imgViewCat performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:lef.imgViewCat.animationImages.count * 0.1]

posted @ 2015-06-12 16:23  姚锦辉  阅读(110)  评论(0编辑  收藏  举报