1、模拟器返回Home键的快捷方式是 shift+命令键+H
2、UIButtonTypeRoundedRect 这个在IOS7里面是不再支持了的。因为IOS7扁平化设计,这个是在IOS6下面的。
3、viewWithTag 若有多个子控件view的tag值相同,则是按照添加的顺序来找的。而且用这个取view还有一个强转问题,因为viewWithTag返回的是通用的UIView,因为他不可能知道View中具体放的时何种view,所以只能返回通用的UIView 。 举例 UIButton * btn = (UIButton *)[self.view viewWithTag:10];
4、找规律
UIView元素的四个属性:
frame : 位置 尺寸
bounds: 尺寸
center: 位置
transform:位置 尺寸 角度
————————————————
CGRect 由 CGRectMake 创建
CGPoint 由 CGPointMake 创建
CGAffineTransform 由 CGAffineTransformMake 创建 ,这个本身太繁杂,引申出三个具体的:
CGAffineTransformMakeRotation 角度变换 CGAffineTransformMakeScale 比例变化 CGAffineTransformMakeTranslation 移动
注意,CGAffineTransform是相对于原状态改变的,所以如果要想view每次运行都有相应的持续变化,需要持续不断的给transform赋新值。例如下,点击按钮使某view不断向上,需要第三方变量,如下处理
@property(nonatomic,assign) CGFloat ty;
_ty -= 50;
someView.transform = CGAffineTransformMakeTranslation(0,_ty); 才可以。
若不想用第三方变量,则用这个方法 CGAffineTransformTranslate(CGAffineTransform transform,CGFloat tx,CGFloat ty) 来进行。该方法是在某view元素的当时的transform为基础来改变状态的。例
someView.transform = CGAffineTransformTranslate(someView.transform,0,-10); 一行代码就可以了,每次运行都会持续改变竖向位置。transform 的 tx ty 默认值都是0
同理,类比 CGAffineTransformMakeTranslation 和 CGAffineTranslate 还有
CGAffineTransformMakeRotation 和 CGAffineTransformRotate:
someView.transform = CGAffineTransformMakeRotation(M_PI_4) 运行时只会相对最初的原状态顺时针旋转45度一次,不论运行多少次。要想持续旋转
someView.transform = CGAffineTransformRotate(someView.transform,M_PI_4) 则每运行一次都会持续顺时针旋转45度
缩放也同理有两个:
someView.transform = CGAffineTransformMakeScale(1.5,1.5) 运行时只会改变一次,长宽都会变为1.5倍
someView.transform = CGAffineTransformScale(someView.transform,1.5,1.5) 每次运行都会长宽变为上一次的1.5倍,持续变化。
5、代码精简
if(self.index == 0){ self.previous.enabled = NO; }else{ self.previous.enabled = YES; } // previous是一自定义的按钮
可精简为 self.previous.enable = (self.index != 0);
6、
strong: 一般对象 包括 NSArray 等
weak: UI控件
assign: int 等基本类型
7、从day324的第五节图片浏览器中得到的知识点
1) 在文件上方可以定义宏,例如 #define kTime = @"abc"
2)查找文件和替换文件的快捷键 command + f
3) 数据的 懒加载/延迟加载:将属性放在get方法中的初始化方法,即用到的时候再取数据。举例
-(NSArray *) imageData {
if(_imageData != nil){ // 数据初始化 } // 这个判断是必须的
return _imageData;
}
8、plist文件名中不要以info字样开头,否则会和support files中文件相冲突
9、获取文件的完整路径方式
1) NSBundle * bundle = [NSBundle mainBundle]; 获得手机的主文件包。一个bundle就是一个文件包
2) String * path = [bundle pathForResource:@"文件名" ofType:@"文件后缀"]; // 也可以文件名那里写全,后缀那里写个nil
通过plilst文件构造Array NSArray * array = [NSArray arrayWithContentsofFile: path];
10、UIImage * image = [UIImage imageNamed:@"文件名"] 这个方法要注意,只适合加载小图。因为这个方法加载的图片会在内存中产生缓存,而且不容易释放。如果通过该方法加载大量大幅图片,内存很容易溢出,程序崩掉。
替代的方式是 通过 [UIImage imageWithContentsofFile: 文件路径 ] 传入文件的全路径来创造图片,没有缓存
11、UIImageView中有动画的一些相关属性,如下
animationImages 传入UIImage 数组
animationRepeatCounts 动画播放次数( 默认是0,无限播放)
animationDuraion 动画播放时间。一个处理方式是每一帧播放时间相同 count*0.01
startAnimating 开始播放动画
12、处理加载动画图片过多,内存溢出的解决方案就是,在动画调用完毕,马上释放图片资源,也即释放animationImages,让someImageView.animationImages = nil;
[self.someImageView performSelector:@selector(setAnimationImages) withObject: nil afterDelay: delay]; 这就释放了!!
因为 这个方法等效于 [self.someImageView setAnimationImages:nil] 的这个setter函数!!
也即 self.someImageView.animationImages = nil 或 _someImageView.animationImages = nil;
这个 _someImageView 其实就是 getter函数方法的返回值!! 即: self.someImageView 即是 getter方法 !!所以 self.someImageView 与 _someImageView 是等价的!!!
13、UIImageView 和 UIButton 的区别与相同
相同点:都可以放图片
不同点:UIButton 可以放多张图片 可以放文字 可以放监听 而图片UIImageView 不可以。两个类的关系如下:
UIButton --> UIControl --> UIView
UIImageView --> UIView
注意UIControl中有 perform 方法,所以 UIButton 中才可以继承!
14、UIButton中,无法使用类似 [UIButton setFont]的方法来设置字体。细究一下,会发现,UIButton中有两个属性 UILabel * titleLabel 和 UIImageView * imageView
所以调整字体大小是通过titleLabel这个属性来进行的,例如btn.titleLabel.font = [UIFont systemFontOfSize:12]; 既然有这个titleLabel的属性,那么自然也可以通过该属性设置按钮文本,即类似 btn.titleLabel.text = @"xxxx"; 但这是不安全和不推荐的,因为无法设置与按钮的状态相适应。正确的做法是用 [btn setTitle:@"xxx" forState:] 方法。同理,自然也可以用 btn.imageView.image = 来进行图片设置,但与上面相同,这同样是不推荐的。推荐的方法还是 [btn setImage: forState:] 和 [btn setBackgroundImage: forState:]
可变字符串和可变数组的定义
NSMutableString * str = [NSMutableString string];
NSMutableArray * array = [NSMutableArray array];
int score = [self.scoreBtn titleForState:UIControlStateNormal].intValue;
[self performSelector:@selector(next) withObject:nil afterDelay:1.0];
15、UIScrollView 之上放一张大图,设置UIScrollView尺寸的方法
self.onescrollview.contentSize = CGSizeMake(600,600);
self.onescrollview.contentSize = self.oneimageview.frame.size;
self.onescrollview.contentSize = self.oneimageview.image.size;
如果UIScrollView无法滚动,可能是如下原因:
1)没有设置 contentSize 2) 没有取消autolayout 3)scrollEnabled = NO 4)没有接收到触摸事件 userInteractionEnabled = NO
UIScrollView 其内放置了整张图片,要拖线的话,可以点左侧第二栏那里按住Ctrl拖。
// UIScrollView代码部分
CGFloat contentH = CGRectGetMaxY(self.bottom.frame) + 10; // bottom元素的底部Y值再加上10个元素
self.scroll.contentSize = CGSizeMake(320, contentH);
self.scroll.scrollEnabled = YES;
//增加额外的滚动区域
self.scroll.contentInset = UIEdgeInsetsMake(10, 0, 10, 0);
// 设置一开始滚动的位置
self.scroll.contentOffset = CGPointMake(0, -70);
16、UIScrollViewDelegate协议,可以在.h中,也可以放在 .m文件上方的 @interface xxxxController () <UIScrollViewDelegate>
常用的代理协议方法:
-(void) scrollViewWillBeginDragging:(UIScrollView *) scrollView; // 开始拖拽
-(void) scrollViewDidScroll:(UIScrollView *) scrollView; // 拖拽中
-(void) scrollViewDidEndDragging:(UIScrollView *) scrollView willDecelerate:(BOOL) decelerate // 结束拖拽
捏合放大缩小的步骤
1、.m文件上方 @interface 后面 <UIScrollViewDelegate>
2、viewDidLoad中 ,设置视图控制器为代理 self.scroll.delegate = self;
设置放大缩小比例
self.scroll.maximumZoomScale = 2.0;
self.scroll.minimumZoomScale = 0.5;
然后实现代理方法,返回要放大缩小的对象:
-(UIView *) viewForZoomingInScrollView:(UIScrollView *) scrollView // 捏合时调用。返回的对象就是捏合的对象。