黑马IOS学习笔记

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  // 捏合时调用。返回的对象就是捏合的对象。

原文地址:https://www.cnblogs.com/appzhang/p/4966963.html