曹老师的iOS基础知识B

{

11、核心动画 需要签协议,但是系统帮签好

一、CABasicAnimation

1、创建基础动画对象

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale.x"];

2、设置动画属性并包装(执行时间,起点(默认0),终点,重复执行(MAXFLOAT非常大的浮点数))

animation.duration = 1;

animation.fromValue = @1;

animation.toValue = @2;

animation.repeatCount = 3;

3、将动画添加到视图的layer上,key:标识一下动画

[_imageView.layer addAnimation:animation forKey:@"CYC666"];

4、动画执行完毕,保存最后状态(默认YES)+ 动画执行完毕,不移除动画(枚举)

animation.removedOnCompletion = NO;

animation.fillMode = kCAFillModeForwards;

二、关键帧动画

1、创建关键帧动画对象

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];

2、包装关键帧(点)

NSValue *value1 = [NSValue valueWithCGPoint:CGPointMake(50, 50)];

NSValue *value2 = [NSValue valueWithCGPoint:CGPointMake(150, 600)];

NSValue *value3 = [NSValue valueWithCGPoint:CGPointMake(250, 100)];

NSValue *value4 = [NSValue valueWithCGPoint:CGPointMake(350, 500)];

3、将关键帧添加到数组

animation.values = @[value1, value2, value3, value4];

4、设置动画属性

animation.duration = 2;

animation.removedOnCompletion = NO;

animation.fillMode = kCAFillModeForwards;

5、将动画添加到图层layer上

[_imageView.layer addAnimation:animation forKey:@"CYC666"]

6、其他方法创建关键字

//路径  animation.path = path.CGPath;

四、动画租

1、创建动画租

CAAnimationGroup *group=[[CAAnimationGroup alloc]init];

2、将动画放入动画租,交给动画组执行

group.animations=@[an1,an2,an3];

3、设置动画组属性(时长、重复次数)

4、将动画组添加到视图layer

[_myImageView.layer addAnimation:group forKey:@"group1"];

五、转场动画http://www.jianshu.com/p/77e089b08b8b

1、创建转场动画

CATransition *transition=[[CATransition alloc] init];

2、设置转场动画的属性

transition.duration=2;

transition.type=@"push"; //指定动画的类型

transition.subtype=@"fromTop";    //通过子类型,可以控制控制器切换的方向

3、添加到view的layer上

[_myImageView.layer addAnimation:transition forKey:@"tran1"];

}

==================================================================================================================================================

{

12、睡眠

1、[NSThread sleepForTimeInterval:9];

2、sleep(9);

}

==================================================================================================================================================

{

13、UIImagePicker 和 相册

一、相片的加载方式

1.通过imageNamed:方式加载

第一次会去沙盒路径加载图片,将它缓存到内存中,以后每次都从内存中加载,速度得到提升

UIImage *image = [UIImage imageNamed:@"baby.jpg"];

2.通过包路径加载,沙盒路径

每一次都需要手动加载,图片特别大,占内存,而且不经常使用,就应该使用这个方法

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"baby" ofType:@"jpg"];

NSData *data = [NSData dataWithContentsOfFile:filePath];

UIImage *image = [UIImage imageWithData:data];

3.从网上加载图片

加载的图片大小有限定,超过最大值则不能下载

NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.tpqq.com/newpic/2010/0708/20107873131tupian.jpg"]];

UIImage *image = [UIImage imageWithData:imgData];

二、UIPickerView

1、创建

UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(30, 100, 300, 200)];

2、签订协议

3、设置代理

pickerView.dataSource = self;

pickerView.delegate = self;

4、实现代理方法(必须的协议方法)

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;

三、 打开照片

1、创建控制器(UIImagePickerController本身就是导航栏的子类)

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];

2、设置资源类型

UIImagePickerControllerSourceTypePhotoLibrary, 所有文件夹

UIImagePickerControllerSourceTypeCamera,       资源来自摄像头

UIImagePickerControllerSourceTypeSavedPhotosAlbum 系统内置相册

imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

设置只显示视频

pickerImage.mediaTypes = [[NSArray alloc] initWithObjects:(NSString*) kUTTypeMovie, (NSString*) kUTTypeVideo, nil];

3、签订协议

4、设置代理

imagePickerController.delegate = self;

5、模态跳转到控制器

[self presentViewController:imagePickerController animated:YES completion:nil];

6、实现代理方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info;

A、判断资源是否来源于相册,并取出选中的相片

if (picker.sourceType == UIImagePickerControllerSourceTypePhotoLibrary || picker.sourceType == UIImagePickerControllerSourceTypeSavedPhotosAlbum) {

B、取出照片

UIImage *image = info[UIImagePickerControllerOriginalImage];

}

7、关闭,返回

[picker dismissViewControllerAnimated:YES completion:nil];

8、或者在点击取消按钮的协议方法中

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;

四、拍照

1、判断摄像头是否存在

UIImagePickerControllerCameraDeviceRear 前置摄像头

UIImagePickerControllerCameraDeviceFront 后置摄像头

if (![UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]) {

return;

}

2、创建控制器

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];

3、签订协议

4、设置代理

imagePickerController.delegate = self;

5、模态跳转到控制器

[self presentViewController:imagePickerController animated:YES completion:nil];

6、实现代理方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info;

A、判断相片来源是否是摄像头

if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {

B、取出照片

UIImage *image = info[UIImagePickerControllerOriginalImage];

C、将照片存到相册

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;

UIImageWriteToSavedPhotosAlbum(image, self, @selector(image: didFinishSavingWithError:contextInfo:), nil);

}

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {}

7、关闭,返回

[picker dismissViewControllerAnimated:YES completion:nil];

8、或者在点击取消按钮的协议方法中

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;

五、打开视频

1、创建控制器

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];

2、设置资源类型

imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

3、媒体类型,图片(@"public.image")、视频(@"public.video")

imagePickerController.mediaTypes = @[@"public.movie"];

4、签订协议

5、设置代理

imagePickerController.delegate = self;

6、模态跳转到控制器

[self presentViewController:imagePickerController animated:YES completion:nil];

7、实现代理方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info;

8、播放视频

NSString *url = info[UIImagePickerControllerMediaURL];

_mpPlayer = [[MPMoviePlayerViewController alloc]

initWithContentURL:[NSURL URLWithString:url]];

[self presentViewController:_mpPlayer animated:YES completion:nil];

六、拍摄视频

1、判断后置摄像头是否存在,如果不存在

if (![UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]) {

//iOS9.0之后推荐使用这种提示方式

UIAlertController *alterController = [UIAlertController alertControllerWithTitle:@"摄像头不存在"

message:nil

preferredStyle:UIAlertControllerStyleAlert];

A、两种提示方式

UIAlertControllerStyleActionSheet = 0,

UIAlertControllerStyleAlert

UIAlertAction *alterAction = [UIAlertAction actionWithTitle:@"确定"

style:UIAlertActionStyleDefault

handler:nil];

更改颜色

[cancelActionsetValue:[UIColorredColor]forKey:@"titleTextColor"];

B、给控制器添加提示

[alterController addAction:alterAction];

[self presentViewController:alterController animated:YES completion:nil];

return;

}

2、创建控制器

UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];

3、指定资源类型

pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;

4、设置代理,签订协议

pickerController.delegate = self;

5、指定媒体类型

pickerController.mediaTypes = @[@"public.movie"];

6、模态转到控制器

[self presentViewController:pickerController animated:YES completion:nil];

7、实现代理方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info;

A、获取媒体的类型

NSString *mediaType = info[UIImagePickerControllerMediaType];

B、判断类型是否一致

if ([mediaType isEqualToString:@"public.image"]) {

C、从字典中获取图片对象

UIImage *image = info[UIImagePickerControllerOriginalImage];

D、当图片来自摄像头,保存图片

if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {

//当处于拍摄状态,将照片存入相册

UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);  //方法名必须这样子写}

} else {

E、播放视频

NSString *url = info[UIImagePickerControllerMediaURL];

_mpPlayer = [[MPMoviePlayerViewController alloc]

initWithContentURL:[NSURL URLWithString:url]];

//播放视频

[self presentViewController:_mpPlayer animated:YES completion:nil];

}

8、返回主界面,显示图片

[self dismissViewControllerAnimated:YES completion:nil];

七、选取多张相片

1、导入库文件

#import                   资源

#import

#import             资源库中某个相册或文件夹

#import           整个资源库:所有视频、照片

#import     资源描述

#import      //必须要导入这个库文件

2、创建资源库 全局

_library = [[ALAssetsLibrary alloc] init];

3、通过资源库访问资源,有多少个group就调用多少次block

[_library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos

usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

//如果存在这个相册就遍历

if (group) {

//遍历相册中所有的资源

[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {

/*

if (index == 3) {   //遍历4个相片

*stop = YES; //指针

};

*/

//CGImageRef cimage = [result thumbnail];  //缩略图

//UIImage *image = [UIImage imageWithCGImage:cimage];

if (result) {

//将数据存到数组中

[_imageArray addObject:result];

}

}];

};

//刷新

[_collectionView reloadData];

} failureBlock:^(NSError *error) {

NSLog(@"访问失败");

}];

4、创建集合视图显示收集的相片

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {

return _imageArray.count;

}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellID" forIndexPath:indexPath];

UIImageView *imageView = (UIImageView *)[cell.contentView viewWithTag:1001];

//取出应资源的数据

ALAsset *result = _imageArray[indexPath.row];

//获取缩略图

CGImageRef cimage = [result thumbnail];

//转换

UIImage *image = [UIImage imageWithCGImage:cimage];

imageView.image = image;

//获取到原始图片

ALAssetRepresentation *presentation = [result defaultRepresentation];

CGImageRef cImage = [presentation fullResolutionImage];

UIImage *fullImage = [UIImage imageWithCGImage:cImage];

return cell;

}

5、通过选中的相片,进行多选

}

==================================================================================================================================================

{

14、触摸

一、UIResponder

1、触摸开始

- (void)touchesBegan:(NSSet *)touches withEvent:(nullable UIEvent *)event {

A、系统会帮我们封装好触摸点对象,我们可以将它取出使用

UITouch *touch = [touches anyObject];

B、触摸点的属性

window 所在窗口

view 所在视图

tapCount 短时间内点触摸的次数,叠加

phase

C、触摸点point

CGPoint locationPoint = [touch locationInView:self];    //获取当前触摸的位置

CGPoint pLocationPoint = [touch previousLocationInView:self];   //获取上一个点的位置

}

2、手势触摸并滑动(时刻调用)

- (void)touchesMoved:(NSSet *)touches withEvent:(nullable UIEvent *)event {

//事件event:加速、远程遥控、触摸

//让视图随手指移动

UITouch *touch = [touches anyObject];

CGPoint locationPoint = [touch locationInView:self];    //获取当前触摸的位置

CGPoint pLocationPoint = [touch previousLocationInView:self];   //获取上一个点的位置

CGPoint center = touch.view.center;

center.x += locationPoint.x - pLocationPoint.x; //根据偏移量修改中心位置

center.y += locationPoint.y - pLocationPoint.y;

touch.view.center = center;

}

3、触摸结束

- (void)touchesEnded:(NSSet *)touches withEvent:(nullable UIEvent *)event;

4、触摸取消、被打断(例如电话打入)

- (void)touchesCancelled:(nullable NSSet *)touches withEvent:(nullable UIEvent *)event;

二、单击与双击

1、获取触摸点

UITouch *touch = [touches anyObject];

2、判断点击双击

if ([touch tapCount] == 1) {

//延迟0.2秒执行单击事件

//[self performSelector:@selector(singerTap) withObject:self afterDelay:.2];//这个方法调用,不能取消

[self performSelector:@selector(singerTap) withObject:nil afterDelay:.2];

} else if ([touch tapCount] == 2) {

//如果是双击,取消单击事件,执行双击事件

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singerTap) object:nil];

[self doubleTap];

}

补充:

[A requireGestureRecognizerToFail:B]函数,

它可以指定当A手势发生时,即便A已经滿足条件了,也不会立刻触发会等到指定的手势B确定失败之后才触发。

三、多点触控

1、开启视图的多点触控(默认是关闭的)

self.multipleTouchEnabled = YES;

2、获取多个手指触摸点

NSArray *array = [touches allObjects];

UITouch *touchA = [array objectAtIndex:0];

UITouch *touchB = [array objectAtIndex:1];

四、事件分发

1、事件分发,找出最合适的视图,处理事件 屏幕 -> 系统 -> UIApplication ->UIWindow ->WhiteView

2、此视图是否接收触摸事件

<1>userInteractionEnabled是否为YES

self.userInteractionEnabled

<2>视图是否隐藏

self.hidden

<3>透明度<0.01

self.alpha

3、触摸的位置在不在视图的范围内

4、遍历自己的子视图,从上往下遍历所有的子视图 重复以上两个步奏

[子视图  hitTest]

五、响应者链

1、iOS系统捕获点击操作,打包成UIEven对象

2、UIApplication对象接收事件

3、UIVindow

4、RootView

5、SubView -> hitTest -> view

6、如果view不接受事件,就原路返回

六、按压响应

- (void)pressesBegan:(NSSet *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);

- (void)pressesChanged:(NSSet *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);

- (void)pressesEnded:(NSSet *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);

- (void)pressesCancelled:(NSSet *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);

七、摇动响应(模拟器也支持摇一摇功能 [Hardware]-[Shake Gesture]或者command+shift+z来测试)

- (void)motionBegan:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);

- (void)motionEnded:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);

}

==================================================================================================================================================

{

15、手势

一、UITapGestureRecognizer 轻击手势

1、创建

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self

action:@selector(tapActiopn:)];

2、属性

点击的次数

tap.numberOfTapsRequired = 2;

点击的手指个数

tap.numberOfTouchesRequired = 2;

2、添加到视图

[self.view addGestureRecognizer:tap];

3、实现手势方法 state

状态

UIGestureRecognizerStateBegan,    开始

UIGestureRecognizerStateChanged, 正在改变

UIGestureRecognizerStateEnded, 结束

二、UIPinchGestureRecognizer 捏合手势

scale 缩放倍数

velocity 速度

三、UIPanGestureRecognizer 平移

1、属性

minimumNumberOfTouches 最少手指数

maximumNumberOfTouches 最多手指数

2、方法

- (CGPoint)translationInView:(nullable UIView *)view;    获取触摸点

- (void)setTranslation:(CGPoint)translation inView:(nullable UIView *)view;

- (CGPoint)velocityInView:(nullable UIView *)view;

四、UIRotationGestureRecognizer 旋转

1、属性

rotation 旋转角度

velocity 速度

五、UILongPressGestureRecognizer 长按

1、属性

numberOfTapsRequired    长按之前需要轻击的次数

numberOfTouchesRequired   长按需要的手指数

minimumPressDuration    长按触发的最小时间

allowableMovement   长按时允许偏移的像素值

2、长按手势会调用两次响应方法,所以为了准确调用,要在方法里判断状态(有多重状态)

if(longPressGesture.state==UIGestureRecognizerStateBegan) {

// do something

}elseif(longPressGesture.state==UIGestureRecognizerStateEnded){

// do something

}

六、UISwipeGestureRecognizer 清扫手势

1、属性

direction 轻扫方向(枚举)

numberOfTouchesRequired 轻扫必须的手指数

}

==================================================================================================================================================

{

16、多媒体 (后台播放❤)

一、AVAudioPlayer  只能播放本地音视频,必须设置成全局变量

1、导入框架

#import

2、创建

NSString *urlPath = [[NSBundle mainBundle] pathForResource:@"test.mp3" ofType:nil];

NSURL *url = [NSURL URLWithString:urlPath];

_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

3、准备播放

[_audioPlayer prepareToPlay];

4、开始播放

[_audioPlayer play];

5、设置参数(当前时间)

_audioPlayer.currentTime = 210;

二、AVPlayer 可播放本地以及网络视频

1、创建

_avPlayer = [[AVPlayer alloc] initWithURL:[NSURL URLWithString:@"http://mp3.qqmusic.cc/yq/5023716.mp3"]];

2、播放

[_avPlayer play];

三、播放系统声音

1、获取本地音频

NSString *sysPath=[[NSBundle mainBundle]pathForResource:@"44th Street Medium.caf" ofType:nil];

NSURL *sysUrl=[NSURL fileURLWithPath:sysPath];

2、注册声音成为系统声音(__bridge桥接  让ARC管理CF框架的内存释放)  CFArrayRef -->NSArray  CFStringRef -->NSString

SystemSoundID soundID; //标识符,全局变量

AudioServicesCreateSystemSoundID((__bridge CFURLRef)sysUrl, &soundID);

3、播放系统声音

AudioServicesPlaySystemSound(soundID);

4、播放震动只能真机演示

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

5、暂停系统声音  还可以继续播放

AudioServicesDisposeSystemSoundID(soundID);

6、完全停止系统声音

AudioServicesRemoveSystemSoundCompletion(soundID);

四、AVAudioRecorder 录音

1、导入框架

#import

2、设置存放录音文件的沙盒路径,录音文件格式为aac,内存小,音质好

NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/recoder.aac"];

3、每次录音之前把旧的录音文件删掉

[[NSFileManager defaultManager] removeItemAtPath:path error:nil];

4、录音配置信息

NSDictionary *info = @{

AVFormatIDKey :

[NSNumber numberWithInt:kAudioFormatMPEG4AAC], //定义文件的格式mac

AVSampleRateKey : @1000,                 //采样率 11400, 32000, 8000

AVNumberOfChannelsKey : @2,            //通道的数目(1单声道,2立体声)

AVLinearPCMBitDepthKey : @8,            //采样位数(8, 16, 24, 32)

AVLinearPCMIsBigEndianKey : @NO,            //大端还是小端 (内存的组织方式)

AVLinearPCMIsFloatKey : @NO            //采样信号是整数还是浮点数

};

5、根据配置信息创建录音对象,全局的,创建前先将其置为nil

_fileUrl = [NSURL fileURLWithPath:path];

NSError *error = nil;

_recoder = [[AVAudioRecorder alloc] initWithURL:_fileUrl

settings:info

error:&error];

6、准备录音

[_recoder prepareToRecord];

7、开始录音

[_recoder record];

8、播放录音

_player = nil;

_player = [[AVAudioPlayer alloc] initWithContentsOfURL:_fileUrl error:nil];

[_player prepareToPlay];

[_player play];

五、AVPlayerViewController    可播放网络视频

1、创建AVPlayerViewController

_avplayerVC = [[AVPlayerViewController alloc] init];

2.设置AVPlayer

_avplayerVC.player = [[AVPlayer alloc] initWithURL:[NSURL URLWithString:@"http://vf1.mtime.cn/Video/2012/06/21/mp4/120621104820876931.mp4"]];

_avplayerVC.view.frame = CGRectMake((375-200)/2, 100, 200, 150);

[self.view addSubview:_avplayerVC.view];

}

==================================================================================================================================================

{

17、block               (定义 - 使用 - 实现)

一、block的创建和使用

1、没有返回值、没有参数的block,去掉变量名,剩下的就是类型

A、创建

void (^myBlock1)();

B、实现

myBlock1 = ^(){

NSLog(@"我就是代码快啊");

};

C、调用、回调

myBlock1();

2、有返回值、有参数的block

NSString *(^myBlock2)(NSInteger a, NSInteger b) = ^(NSInteger a, NSInteger b) {

return @"哈哈";

};

NSString *string = myBlock2(99,88);

NSLog(@"string = %@", string);

3、inlineblock快速召唤block

4、typedef定义block

A、定义

typedef void (^MyBlock)();

B、创建block变量

MyBlock b = ^{

NSLog(@"typedef");

};

C、调用

b();

二、block对局部变量的内存管理

1、block自带自动变量 调用的时候才会被创建

void (^block1)(int a);

block1 = ^(int a) {

NSLog(@"a = %d", a);

};

block1(10);     //2016-05-02 15:36:00.979 01_block[3307:117381] a = 10

2.如果block中使用了外部的局部变量,block会保存一下外部变量的值,在block中调用的时候,使用的就是之前保存的值,并且此值之后的任何变化都不会影响

int b = 10;

void (^block2)() = ^() {

NSLog(@"b = %d", b);

};

b = 20;

block2();    //2016-05-02 15:36:00.980 01_block[3307:117381] b = 10

3、外部局部变量在block中都被看做常量

int c = 30;

void (^block3)() = ^() {

//c = 100;    //被看做常亮,禁止修改

NSLog(@"c = %d", c);

};

block3();   //2016-05-02 15:39:38.201 01_block[3370:118356] c = 30

4、想要局部变量正常使用 __block修饰

__block int d = 12;

void (^block4)() = ^() {

d = 33;

NSLog(@"d = %d", d);

};

block4();   //2016-05-02 15:42:01.683 01_block[3405:119026] d = 33

5、全局变量都可以正常使用

test = 233;

void (^block5)() = ^() {

NSLog(@"test = %d", test);

};

block5();   //2016-05-02 15:44:15.272 01_block[3435:119642] test = 233

三、block导致的循环引用问题

1、block使用了全局变量,那么block会持有(retain)变量所在的对象

2、_block作为当前对象的属性,self会持有属性

self ---> _block

3、_block使用了全局属性,会持有该属性所在的对象

_block ---> self        应该断开这条线

4、解决方法

使用__weak关键字创建一个弱引用的对象指向强引用的对象,使用弱引用对象去调用属性  不会造成循环引用

四、block变量本身的内存管理

1、block根据在内存中的位置,分为一下三中情况

NSConcreteStackBlock  栈区的block    copy-->   拷贝到堆区

NSConcreteGlobalBlock  全局区的block  copy--> 没有任何变化

NSConcreteMallocBlock  堆区的block  copy--> retainCount +1

2、栈区的block 局部变量,由系统管理内存

3、如果使用@property声明一个block,使用copy修饰

}

==================================================================================================================================================

{

18、Xcode添加字体

1、将字体font文件导入项目

2、在该plist里添加一个新的项:Fonts provided by application,在里面的Item项里添加你的font文件的名字,如:迷你简胖娃.TTF(注意大小写)

3、前往 项目 -> Build Phases -> Compile sources,将字体文件拖到这里

4、使用,不是文件名,而是用字体预览册打开字体时在标题栏里显示的文字就是你的字体的名字。

[label setFont:[UIFont fontWithName:@”font的名字” size:20]];

}

==================================================================================================================================================

{

19、常用控件

一、UILabel 文本标签

1、属性

text 显示的文本

textAlignment 对其方式(枚举)

font 字体

textColor 字体颜色

numberofLines 文本最多行数

lineBreakMode 文本过长时的截断方式(只有numberofLines为0时才有效果)

label.lineBreakMode = NSLineBreakByCharWrapping;以字符为显示单位显示,后面部分省略不显示。

label.lineBreakMode = NSLineBreakByClipping;剪切与文本宽度相同的内容长度,后半部分被删除。

label.lineBreakMode = NSLineBreakByTruncatingHead;前面部分文字以……方式省略,显示尾部文字内容。

label.lineBreakMode = NSLineBreakByTruncatingMiddle;中间的内容以……方式省略,显示头尾的文字内容。

label.lineBreakMode = theNSLineBreakByTruncatingTail;结尾部分的内容以……方式省略,显示头的文字内容。

label.lineBreakMode = NSLineBreakByWordWrapping;以单词为显示单位显示,后面部分省略不显示。

enabled 设置文本内容是否可变

minimumScaleFactor 文本最小字体

highlightedTextColor 高亮时的颜色(与highlighted一起使用)

shadowColor 文本阴影颜色

shadowOffset 阴影偏移量

userInteractionEnabled 是否接受用户交互(默认是NO)

preferredMaxLayoutWidth 优先选择标签布局的最大宽度

baselineAdjustment (枚举)如果adjustsFontSizeToFitWidth属性设置为YES,这个属性就来控制文本基线的行为

UIBaselineAdjustmentAlignBaselines 文本最上端与中线对齐

UIBaselineAdjustmentAlignCenters 文本中线与label中线对齐

UIBaselineAdjustmentNone 文本最低端与label中线对齐

attributedText 标签属性文本,能一起设置

adjustsFontSizeToFitWidth=YES;     根据字数调整text的大小

2、方法

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines;

- (void)drawTextInRect:(CGRect)rect;

3、通过文本计算空间大小

NSDictionary *dic = @{NSFontAttributeName : [UIFont systemFontOfSize:16]};

CGRect textRect= [self.model.text  boundingRectWithSize:CGSizeMake(kScreenWidth - 2 *kSpace, 999999)  attributes:dic context:nil];

二、UITextField 文本输入框

1、属性

enablesReturnKeyAutomatically 默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disabled的

borderStyle 设置边框样式(枚举),必须设置

backgroundColor 设置输入框的背景颜色,此时设置为白色 如果使用了自定义的背景图片边框会被忽略掉

background 设置背景视图,只有UITextBorderStyleNone的时候改属性有效

disabledBackground 设置enable为no时,textfield的背景

placeholder 占位符,(改变placeHolder的颜色,使用富文本,单纯改变textcolor是不可以的)

clearButtonMode 输入框中是否有个叉号,在什么时候显示,用于一次性删除输入框中的内容(枚举)

text 输入框中的文字

secureTextEntry                               是否安全输入

autocorrectionType                          是否纠错(枚举)

clearsOnBeginEditing                     是否再次编辑就清空

textAlignment                                    水平对其方式

contentVerticalAlignment                垂直对其方式

adjustsFontSizeToFitWidth 设置为YES时文本会自动缩小以适应文本窗口大小.默认是保持原来大小,而让长文本滚动

设置自动缩小显示的最小字体大小

text.minimumFontSize = 20;

keyboardType 设置键盘样式(枚举)

autocapitalizationType 首字母大写模式(枚举)

returnKeyType return按钮样式(枚举)

keyboardAppearance 键盘的外观(枚举)

tintColor 设置光标的颜色

rightView 最右侧加图片是以下代码  左侧类似

UIImageView *image=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"right.png"]];

text.rightView=image;

text.rightViewMode = UITextFieldViewModeAlways;

editing 是否允许编辑

delegate 代理,对应的协议为

2、代理方法

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField;

return YES;弹出键盘

- (void)textFieldDidBeginEditing:(UITextField *)textField;

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField;

- (void)textFieldDidEndEditing:(UITextField *)textField;

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;

//当用户使用自动更正功能,把输入的文字修改为推荐的文字时,就会调用这个方法。

//这对于想要加入撤销选项的应用程序特别有用

//可以跟踪字段内所做的最后一次修改,也可以对所有编辑做日志记录,用作审计用途。

//要防止文字被改变可以返回NO

//这个方法的参数中有一个NSRange对象,指明了被改变文字的位置,建议修改的文本也在其中

- (BOOL)textFieldShouldClear:(UITextField *)textField;

- (BOOL)textFieldShouldReturn:(UITextField *)textField;

[textField endEditing:YES];       //点击 return 时收起键盘

3、键盘相关的通知事件

UITextFieldTextDidBeginEditingNotification    //已经开始编辑

UITextFieldTextDidChangeNotification        //已经开始改变

UITextFieldTextDidEndEditingNotification    //已经结束编辑

UIKeyboardWillShowNotification   //键盘显示之前发送

UIKeyboardDidShowNotification    //键盘显示之后发送

UIKeyboardWillHideNotification   //键盘隐藏之前发送

UIKeyboardDidHideNotification    //键盘隐藏之后发送

4、失去焦点、光标的问题:

看看tintColor是否设置了,很有可能是因为tintColor是白色的,你看不见看不见

三、UIImageView

1、属性

highlightedImage 高亮图片

animationImages 设置序列帧动画的图片数组

highlightedAnimationImages 设置高亮状态下序列帧动画的图片数组(必须设置imageView为高亮状态)

animationDuration 设置序列帧动画播放的时长

animationRepeatCount 设置序列帧动画播放的次数

userInteractionEnabled 设置是否允许用户交互,默认不允许用户交互(重要)

highlighted 设置是否为高亮状态,默认为普通状态

2、方法

[imageView startAnimating];     //开启图片动画

- (void)startAnimating;

- (void)stopAnimating;

- (BOOL)isAnimating;

3、拉伸image(左右端盖,上下端盖,只对那一像素进行拉伸,其他像素不变)

特别注意:image本身不应该大于视图的大小。如果image比视图还大,那还拉伸个屁

两个数值都是像素的大小,可以用image.size.width*0.5这种方式去设置

UIImage *newImage = [image stretchableImageWithLeftCapWidth:0 topCapHeight:4];

4、image的填充模式(填充模式必须在设置图片之前设置,否则会出错或设置不凑效)

imageView.contentMode = UIViewContentModeScaleAspectFit;    不缩放,一边刚好一边不够

UIViewContentModeScaleToFill    填充

UIViewContentModeScaleAspectFill     等比例填满(nice)

5、压缩image

NSData*thumbData =UIImageJPEGRepresentation(image,0.5);

6、设置圆角,必须设置剪切模式,不然只有描边,没有圆角

headImageView.layer.masksToBounds=YES;

7、从网上获取image

NSURL*imageUrl = [NSURLURLWithString:[USER_DobjectForKey:@"head_img"]];

UIImage*image = [UIImageimageWithData:[NSDatadataWithContentsOfURL:imageUrl]];

//图片压缩到指定大小

- (

UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize withImage:(UIImage*)image {

UIImage*sourceImage = image;

UIImage*newImage =nil;

CGSizeimageSize = sourceImage.size;

CGFloatwidth = imageSize.width;

CGFloatheight = imageSize.height;

CGFloattargetWidth = targetSize.width;

CGFloattargetHeight = targetSize.height;

CGFloatscaleFactor =0.0;

CGFloatscaledWidth = targetWidth;

CGFloatscaledHeight = targetHeight;

CGPointthumbnailPoint =CGPointMake(0.0,0.0);

if(CGSizeEqualToSize(imageSize, targetSize) ==NO)

{

CGFloatwidthFactor = targetWidth / width;

CGFloatheightFactor = targetHeight / height;

if(widthFactor > heightFactor)

scaleFactor = widthFactor;

// scale to fit heightelse

scaleFactor = heightFactor;

// scale to fit width

scaledWidth= width * scaleFactor;

scaledHeight = height * scaleFactor;

// center the imageif(widthFactor > heightFactor)

{

thumbnailPoint.

y= (targetHeight - scaledHeight) *0.5;

}

elseif(widthFactor < heightFactor)

{

thumbnailPoint.

x= (targetWidth - scaledWidth) *0.5;

}

}

UIGraphicsBeginImageContext(targetSize);// this will crop

CGRectthumbnailRect =CGRectZero;

thumbnailRect.

origin= thumbnailPoint;

thumbnailRect.

size.width= scaledWidth;

thumbnailRect.

size.height= scaledHeight;

[sourceImage

drawInRect:thumbnailRect];

newImage =

UIGraphicsGetImageFromCurrentImageContext();

if(newImage ==nil)

NSLog(@"could not scale image");

//pop the context to get back to the defaultUIGraphicsEndImageContext();

returnnewImage;

}

四、UIButton 按钮

1、属性

buttonType 类型(枚举)

2.adjustsImageWhenDisabled

当按钮禁用的情况下,图像的颜色会被画深一点,默认为YES。

3.adjustsImageWhenHighlighted

当按钮高亮的情况下,图像的颜色会被画深一点,默认为YES。

4、方法

+ (instancetype)buttonWithType:(UIButtonType)buttonType     创建按钮

5、设置按钮内容的对其方式

addressBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;    //左对齐

addressBtn.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;        //向上对其

五、UIActivityIndicatorView 活动指示器

1、创建,确定样式。不必设置frame,因为frame只影响背景的大小,指示器大小不变

_activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];

2、停止动画后隐藏,默认是YES

_activity.hidesWhenStopped = NO;

3、开启动画

[_activity startAnimating];

4、停止动画

[_activity stopAnimating];

5、是否在动

[_activity isAnimating];

六、UIAlertView 提示

1、创建,注意UIAlertView调用show显示出来的时候,系统会自动强引用它,不会被释放。

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"麻烦开始了吗?"

message:@"麻烦不断"

delegate:self

cancelButtonTitle:@"拒绝"

otherButtonTitles:@"默默忍受",@"我不想说话",@"嘿嘿,我们竖着排啦", nil];

2、显示

[alert show];

3、标题

alert.title = @"点击这个昵称灰会变美哦";

4、信息

alert.message = @"你只是个小马仔,永远都是";

5、按钮个数(只读)

NSLog(@"%ld", alert.numberOfButtons);

6、取消按钮的index,可以自己设置

alert.cancelButtonIndex = 1;

7、模式,没效果

alert.alertViewStyle = UIAlertViewStylePlainTextInput;

8、代理、协议、协议方法

当点击了按钮

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;

消失

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex;

即将消失

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex;

七、UIDatePicker 日期采集器

1、创建

UIDatePicker *date = [[UIDatePicker alloc] init];

2、模式

date.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];

3、设置picker的显示模式:只显示日期

date.datePickerMode = UIDatePickerModeDate;

4、日期

NSLog(@"%@", date.date);

5、设置时区

timeZone

6、设置日历(当前)

[datePicker setCalendar:[NSCalendar currentCalendar]];

7、最小日期

minimumDate

8、最大日期

maxinumDate

9、手动调整转到日期

maxinumDate

10、监听值改变

[date addTarget:self action:@selector(dateChange:) forControlEvents:UIControlEventValueChanged];

八、UIPageControl 页码指示器

1、创建

_pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(100, 600, 150, 50)];

2、设置控制的页数

_pageControl.numberOfPages = 6;

3、当前页数

_pageControl.currentPage = 3;

4、当只有一页时,不显示指示器(默认NO)

_pageControl.hidesForSinglePage = YES;

5、设置页码指示器颜色

_pageControl.pageIndicatorTintColor = [UIColor redColor];

6、设置当前页码指示器的颜色

_pageControl.currentPageIndicatorTintColor = [UIColor lightGrayColor];

7、添加监听事件(手势触控才会触发)

[_pageControl addTarget:self action:@selector(pageControlAction) forControlEvents:UIControlEventValueChanged];

九、UISegment 分段控制器

1、创建

UISegmentedControl *segment = [[UISegmentedControl alloc] initWithItems:@[@"第一",@"第二",@"第三",@"第四"]];

2、数目(只读)

NSLog(@"%ld", segment.numberOfSegments);

3、样式(无效)

segment.segmentedControlStyle = UISegmentedControlStyleBar;

4、颜色样式(有像素的地方的颜色)

segment.tintColor = [UIColor cyanColor];

5、设置在点击后是否恢复原样(效果不好)

segment.momentary = YES;

6、选中项

segment.selectedSegmentIndex = 1;

7、设置标题

[segment setTitle:@"二二" forSegmentAtIndex:1];

8、获取标题

NSLog(@"%@", [segment titleForSegmentAtIndex:1]);

9、添加值改变事件

[segment addTarget:self action:@selector(segmentAction) forControlEvents:UIControlEventValueChanged];

10、其他方法

- (void)setImage:(nullable UIImage *)image forSegmentAtIndex:(NSUInteger)segment;

- (nullable UIImage *)imageForSegmentAtIndex:(NSUInteger)segment;

- (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment;

- (CGFloat)widthForSegmentAtIndex:(NSUInteger)segment;

- (void)setEnabled:(BOOL)enabled forSegmentAtIndex:(NSUInteger)segment;    //使某一项不可选

十、UISlider 滑块

1、创建

UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(35.5, 300, 300, 50)];

2、最小值、最大值、当前值

slider.maximumValue = 10;

slider.minimumValue = 0;

slider.value = 5;

3、值小边颜色、值大边颜色、滑块颜色

slider.maximumTrackTintColor = [UIColor lightGrayColor];

slider.minimumTrackTintColor = [UIColor redColor];

slider.thumbTintColor = [UIColor orangeColor];

4、添加值改变响应

[slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];

5、如果设置YES,在拖动滑块的任何时候,滑块的值都会改变。默认设置为YES

slider.continuous = NO;

6、给最左边添加图片,图片不在滑动条上

[slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];

十一、UISwitch 开关

1、ON时的颜色 onTintColor

2、OFF时的颜色 tintColor

3、onImage

4、offImage

5、设置ON

swithImage.on = YES;

6、thumbTintColor 拇指颜色

7、增加事件响应机制

十二、UITextView

1、创建

UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(35.5, 20, 300, 600)];

2、text: 设置textView中文本

textView.text =

3、字体

textView.font = [UIFont systemFontOfSize:20];

4、颜色

textView.textColor = [UIColor whiteColor];

5、背景颜色

textView.backgroundColor = [UIColor brownColor];

6、对其方式

textView.textAlignment = NSTextAlignmentLeft;

7、是否可以被输入(默认YES),当设置为NO,不能编辑文字,但是能选中

textView.editable = NO;

8、当设置为NO以后,就不能编辑了,不能选中文字

textView.selectable = NO;

9、设置文本,一旦设置了,上文全都没了,而且格式也被清空

textView.attributedText = [[NSAttributedString alloc] initWithString:@"迎面吹来淡淡的幽香"];

10、编辑时底部弹出的视图(默认是键盘)

textView.inputView = [[UIDatePicker alloc] init];

11、设置弹出视图上方的辅助视图

textView.inputAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];

12、在用户使用虚拟键盘进行输入时,全选之前的

textView.clearsOnInsertion = YES;

13、代理方法

- (BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text;

textView.text.length     计算的长度不准确,空格也算一个字符

text     输入的字符

- (void)textViewDidChange:(UITextView*)textView;

textView.text.length     计算的长度准确,空格也算一个字符

14、使得输入return时没有任何效果

- (BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text {

if([textisEqualToString:@"\n"]) {

returnNO;

}

returnYES;

}

十三、UIAlertController

1、创建

_alert = [UIAlertController alertControllerWithTitle:@"警示框"

message:@"嫁给我好吗?"

preferredStyle:UIAlertControllerStyleAlert];

2、给警示框添加按钮

[_alert addAction:[UIAlertAction actionWithTitle:@"好的"

style:UIAlertActionStyleDefault

handler:^(UIAlertAction * _Nonnull action) {

NSLog(@"点击确定后会执行这个操作");

}]];

[_alert addAction:[UIAlertAction actionWithTitle:@"拒绝"

style:UIAlertActionStyleDefault

handler:^(UIAlertAction * _Nonnull action) {

NSLog(@"被拒绝了");

}]];

3、模态弹出提示框

[self presentViewController:_alert animated:YES completion:nil];

弹框有输入框

UIAlertController*alertController = [UIAlertControlleralertControllerWithTitle:@"验证原密码"message:@"为了你的数据安全,操作前请先填写原密码"preferredStyle:(UIAlertControllerStyleAlert)];

//创建文本框

[alertController

addTextFieldWithConfigurationHandler:^(UITextField*textField){

textField.

placeholder=@"请输入您的密码";

textField.

secureTextEntry=YES;

}];

UIAlertAction*okAction = [UIAlertActionactionWithTitle:@"确定"style:(UIAlertActionStyleDefault)handler:^(UIAlertAction*action) {

//读取文本框的值显示出来

UIActionSheet的使用

UIActionSheet*actionSheet = [[UIActionSheetalloc]

initWithTitle:nildelegate:selfcancelButtonTitle:@"取消"destructiveButtonTitle:nilotherButtonTitles:@"发送位置",@"位置实时共享",nil];

[actionSheetshowInView:self.view];

实现点击协议方法

- (void)actionSheet:(UIActionSheet*)actionSheet

clickedButtonAtIndex:(NSInteger)buttonIndex

}

搜索框

UISearchBar

==================================================================================================================================================

{

20、视图控制器

一、生命周期(需要调用父类的方法)

1、视图已经家在完成

- (void)viewDidLoad;

2、视图即将出现

- (void)viewWillAppear:(BOOL)animated

3、视图已经出现

- (void)viewDidAppear:(BOOL)animated

4、视图即将消失

- (void)viewWillDisappear:(BOOL)animated

5、视图已经消失

- (void)viewDidDisappear:(BOOL)animated

6、接收到内存警告

- (void)didReceiveMemoryWarning

二、模态视图

1、转场风格(枚举)

viewControllerB.modalTransitionStyle = UIModalTransitionStylePartialCurl;

2、模态跳转(原控制器还未被销毁)

[self presentViewController:viewControllerB animated:YES completion:nil];

3、模态返回(本控制器被销毁)

[self dismissViewControllerAnimated:YES completion:nil];

三、通过故事版加载视图控制器

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

MyViewController *myVC = [storyBoard instantiateViewControllerWithIdentifier:@"CYC666"];

}

==================================================================================================================================================

{

21、导航控制器

一、基本用法

1、创建

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:[[FirstViewController alloc] init]];

2、跳到下个导航控制器

[self.navigationController pushViewController:secondView animated:YES];

3、返回上一个导航控制器

[self.navigationController popViewControllerAnimated:YES];      //返回上一级

[self.navigationController popToRootViewControllerAnimated:YES];        //返回第一个

4、设置当前导航控制器标题

self.title = @"第一个视图控制器";

5、当跳转到下一页,隐藏标签栏(默认NO)

self.navigationController.hidesBottomBarWhenPushed = YES;

6、导航栏是否透明(默认透明,需要在创建导航控制器的时候设定)

navigationController.navigationBar.translucent = NO;

7、导航栏是否隐藏(默认不隐藏,创建的时候设定)

navigationController.navigationBarHidden = YES;

8、右边按钮

UIBarButtonItem *button1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:系统提供的按钮类型 target:self action:响应方法];

UIBarButtonItem *button3 = [[UIBarButtonItem alloc] initWithTitle:@"程" style:UIBarButtonItemStylePlain target:self action:nil];

self.navigationItem.rightBarButtonItems = @[button1,button2,…];

[self.navigationItem setRightBarButtonItem:sendItem];

[self.navigationItem setLeftBarButtonItem:closeItem];

注意:

设置好的的图片可能是蓝色的,而不是所给图像的颜色,可以根据以下代码控制颜色

改变按钮的颜色tintColor     改变导航栏颜色barTintColor

单独设置可以使用[rightButtonsetTintColor:[UIColorblackColor]];

self.navigationController.navigationBar.tintColor= [UIColorwhiteColor];

设置按钮的名字和颜色

self.navigationItem.backBarButtonItem= [[UIBarButtonItemalloc]initWithTitle:@“返回上一级"

style:UIBarButtonItemStyleDonetarget:self

action:@selector(backButtonItemAction:)];

self.navigationController.navigationBar.tintColor= [UIColorwhiteColor];

9、本页的返回按钮(在下一页显示)

UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithImage:图片 style:UIBarButtonItemStylePlain target:self action:nil];

self.navigationItem.backBarButtonItem = button3;

10、标题视图(是直接赋值,而不是添加子视图)

self.navigationItem.titleView  = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"20140210141806-1621168773.jpg.png"]];

11、注意点:

(1)、navigationItem是viewController的属性,只有用viewController调用才会生效

(2)、navigationBar是navigationController的属性,需要navigationController调用

12、设置导航栏提示用户的内容

self.navigationItem.prompt = @“加载”;

self.navigationItem.prompt = nil;

13、设置导航控制器的颜色(在创建nav的时候设置,或者再VC的viewDidAppear里设置,注意:不能再viewDidload里设置)

friendCircleNAV.navigationBar.barTintColor=

14、获取某个视图所在的导航控制器

- (UIViewController*)viewController {

for(UIView* next = [selfsuperview]; next; next = next.superview) {

UIResponder* nextResponder = [nextnextResponder];

if([nextResponderisKindOfClass:[UINavigationControllerclass]]) {

return(UIViewController*)nextResponder;

}

}

returnnil;

15、在使用navigation的pushViewController进行push的时候,两个页面间的动画会出现卡顿一下再推出的效果,最后找出,是因为iOS7 viewController背景颜色的问题,其实不是卡顿,是由于透明色颜色重叠后视觉上的问题,只要在新push里设置下背景颜色就好了

}

}

16、导航栏控制器的左边返回按钮

当前控制器页面的返回按钮是属于上一个控制器的属性,所以要设置当前控制器的返回按钮样式,就应该在上一个控制器中设置,而且不应该在原有的返回按钮基础上设置,应当创建新的导航控制器按钮

UIBarButtonItem*backItem = [[UIBarButtonItemalloc]init];

backItem.

title=@"邦友圈";

self.navigationItem.backBarButtonItem= backItem;

17、点击显示、隐藏导航栏

self.navigationController.hidesBarsOnTap = YES;

==================================================================================================================================================

{

22、标签控制器

一、系统提供的样式

1、创建

UITabBarController *tabBarController = [[UITabBarController alloc] init];

2、设置子控制器

tabBarController.viewControllers = @[viewControllerA,viewControllerB,viewControllerC,viewControllerD,viewControllerE,viewControllerF];

3、设置选中的标签

tabBarController.selectedIndex = 2;

4、设置单个标签

UITabBar *tabBar = tabBarController.tabBar;

5、颜色

tabBar.tintColor = [UIColor redColor];

6、item的分布样式

tabBar.itemPositioning = UITabBarItemPositioningCentered;

7、是否透明

tabBar.translucent = NO;

8、item 大小距离

tabBar.itemWidth = 150;

tabBar.itemSpacing = 150;

9、系统样式

viewControllerA.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemSearch tag:1000];

10、协议方法(需要设置代理,协议好像已经签好)

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController NS_AVAILABLE_IOS(3_0) {

NSLog(@"即将选中");

return YES;

}

二、自定义tabbar(子类化)

1、添加视图

self.viewControllers

2、隐藏系统的tabbar

self.tabBar.hidden = YES;

3、设置背景图片(imageView,开启用户交互)

4、for循环添加button,并添加同一个响应,button可以自定义

5、在button下面添加选中的背景图片,跟随选中的button进行位移

_selectImage.center = buttonNew.center;

6、根据button的tap值切换标签(添加动画效果)

self.selectedIndex = sender.tag - 4980;

三、三级控制器

1、导航栏push后隐藏标签栏

navigationController.hidesBottomBarWhenPushed = YES;

}

==================================================================================================================================================

{

23、滑动视图

1、创建

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 375, 300)];

2、内容尺寸

scrollView.contentSize = CGSizeMake(750, 400);

3、是否显示滑动条

scrollView.showsHorizontalScrollIndicator = NO;        //水平

scrollView.showsVerticalScrollIndicator = NO;          //垂直

4、滑动条样式

scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;

5、回弹效果

scrollView.bounces = NO;

6、分页效果

scrollView.pagingEnabled = YES;

7、点击状态栏回到顶部(默认YES)

scrollView.scrollsToTop = YES;

8、内容尺寸的偏移量(初始(100,100)点会被移到原点)

scrollView.contentOffset = CGPointMake(100, 100);

9、边缘扩展(上左下右)

scrollView.contentInset = UIEdgeInsetsMake(50, 100, 200, 150);

10、控制单方向移动

scrollView.directionalLockEnabled = YES;

11、当内容尺寸小于滑动视图大小,仍然允许左右拖动(默认NO)

scrollView.alwaysBounceHorizontal = YES;

scrollView.alwaysBounceVertical = YES;

12、允许滑动(默认YES)

scrollView.scrollEnabled = NO;

13、控制滑动条显示的位置与边界的距离(相当于控制一个区域,滑动条显示在这个区域,不能超出)

scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 100, 20, 0);

14、减速速度(使滑动更加可控)

scrollView.decelerationRate = UIScrollViewDecelerationRateFast;

15、控制最小、最大缩放倍数

scrollView.minimumZoomScale = 0.5;

scrollView.maximumZoomScale = 3;

16、缩放倍数

scrollView.zoomScale = 1.5;

17、方法

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;

- (void)setZoomScale:(CGFloat)scale animated:(BOOL)animated NS_AVAILABLE_IOS(3_0)

18、协议方法

(1)、开始拖拽

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;

(2)、将要拖拽结束

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0);

(3)、已经结束拖拽

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

(4)、即将开始减速

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView

(5)、已经结束减速

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

19、在内容尺寸小于frame时,允许回弹效果

need-to-insert-img

20、缩放滑动视图,必须重写以下方法,返回的view即为要缩放的view(前提是最大放大倍数必须大于最小放大倍数,好像要大于一)

- (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView;

return 要缩放的图

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容