Dawninest

Objective-C | 动画

UIView动画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[UIView animateWithDuration:1 delay:1 options:UIViewAnimationOptionCurveLinear animations:^{
xxx
} completion:^(BOOL finished) {
xxx
}];
animateWithDuration-动画持续时间
delay-动画延迟时间
options-动画渐入渐出
动画线性效果选择-options
UIViewAnimationOptionCurveEaseInOut 匀加速-匀速-匀减速
UIViewAnimationOptionCurveEaseIn 匀加速-匀速
UIViewAnimationOptionCurveEaseOut 匀速-匀减速
UIViewAnimationOptionCurveLinear 匀速
animations-在动画持续时间内执行的变幻
completion-该动画持续时间结束后执行的下一步动作,可在此嵌套下一步动画

缩放

1
_animationView.transform = CGAffineTransformScale(_animationView.transform, 0.5, 0.5);

旋转

1
_animationView.transform = CGAffineTransformRotate(_animationView.transform, M_PI_4);

变换动作-翻转

1
2
3
4
5
6
[UIView transitionWithView:_animationView duration:1 options:UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionTransitionFlipFromLeft animations:nil completion:nil];

options 多个可用 | 间隔
翻转独有线性效果选项
UIViewAnimationOptionTransitionFlipFromLeft
UIViewAnimationOptionTransitionFlipFromRight

弹性动画

1
2
3
4
5
6
7
8
usingSpringWithDamping 阻尼系数 0-1 越小越明显
initialSpringVelocity 初始速度

[UIView animateWithDuration:0.2 delay:0 usingSpringWithDamping:0.5 initialSpringVelocity:0 options:0 animations:^{

} completion:^(BOOL finished){

}];

补充

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
UIViewAnimationOptions详细
UIViewAnimationOptionLayoutSubviews //动画过程中保证子视图跟随运动
UIViewAnimationOptionAllowUserInteraction //动画时允许用户交流,比如触摸
UIViewAnimationOptionBeginFromCurrentState //所有视图从当前状态开始动画
UIViewAnimationOptionRepeat //动画无限重复
UIViewAnimationOptionAutoreverse //动画运行到结束点后仍然以动画方式回到初始点,前提是设置动画无限重复
UIViewAnimationOptionOverrideInheritedDuration //忽略外层动画嵌套的执行时间
UIViewAnimationOptionOverrideInheritedCurve //忽略外层动画嵌套的时间变化曲线
UIViewAnimationOptionAllowAnimatedContent //通过改变属性和重绘实现动画效果,如果key没有提交动画将使用快照
UIViewAnimationOptionShowHideTransitionViews //用显隐的方式替代添加移除图层的动画效果
UIViewAnimationOptionOverrideInheritedOptions //不继承父动画设置或动画类型
时间函数曲线相关
UIViewAnimationOptionCurveEaseInOut //时间曲线函数,由慢到快
UIViewAnimationOptionCurveEaseIn //时间曲线函数,由慢到特别快
UIViewAnimationOptionCurveEaseOut //时间曲线函数,由快到慢
UIViewAnimationOptionCurveLinear //时间曲线函数,匀速
转场动画相关的
UIViewAnimationOptionTransitionNone //无转场动画
UIViewAnimationOptionTransitionFlipFromLeft //转场从左翻转
UIViewAnimationOptionTransitionFlipFromRight //转场从右翻转
UIViewAnimationOptionTransitionCurlUp //上卷转场
UIViewAnimationOptionTransitionCurlDown //下卷转场
UIViewAnimationOptionTransitionCrossDissolve //转场交叉消失
UIViewAnimationOptionTransitionFlipFromTop //转场从上翻转
UIViewAnimationOptionTransitionFlipFromBottom //转场从下翻转
关键帧
UIViewKeyframeAnimationOptionCalculationModeLinear    
UIViewKeyframeAnimationOptionCalculationModeDiscrete  
UIViewKeyframeAnimationOptionCalculationModePaced     
UIViewKeyframeAnimationOptionCalculationModeCubic     
UIViewKeyframeAnimationOptionCalculationModeCubicPaced

高级动画

CALayer 图层

初始化

1
2
3
4
5
6
7
8
9
10
11
12
@property (nonatomic,strong) CALayer *layer;
_layer = [CALayer layer];
_layer.backgroundColor = [UIColor colorWithRed:0.91 green:0.34 blue:0.31 alpha:1].CGColor;
_layer.bounds = CGRectMake(0, 0, 50, 50);
_layer.position = self.view.center;//设置中旬点
_layer.shadowColor = [UIColor colorWithRed:0.21 green:0.6 blue:0.93 alpha:1].CGColor;
_layer.shadowOffset = CGSizeMake(3, 3);
_layer.shadowOpacity = 0.8; 透明度
设置锚点,锚点的位置永远和中心点重合
默认(0.5,0.5),即中心点,按照比例取值,(0,0)左上角,(1,1)右下角
_layer.anchorPoint = CGPointMake(1, 1);
[self.view.layer addSublayer:_layer];

重写触摸事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
UITouch *touch = touches.anyObject;
CGPoint touchPoint = [touch locationInView:self.view];
CGFloat width = _layer.bounds.size.width;
if (width == 50) {
width = 50 * 4;
}else{
width = 50;
}
_layer.bounds = CGRectMake(0, 0, width, width);
_layer.position = touchPoint;
}
在使用CALayer 图层动画的时候,初始化之后的属性变化会自动以动画形式展现

CATransition 过渡动画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CATransition *animation = [CATransition animation];
持续时间
animation.duration = 0.5;
线性规律
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
/*私有API 不可用于上架
cube、suckEffect、oglFlip、rippleEffect、pageCurl、pageUnCurl
cameraIrisHollowOpen、cameraIrisHollowClose
*/
animation.type = @"rippleEffect";
过渡动画类型 kCATransition
kCATransitionFade
kCATransitionMoveIn
kCATransitionPush
kCATransitionReveal
animation.type = kCATransitionPush;

配置转场动画子类型
animation.subtype = kCATransitionFromLeft;
添加动画
[self.view.layer addAnimation:animation forKey:@"transition"];

CABasicAnimation 基础动画

先确定基础动画的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CABasicAnimation *positionAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
持续时间
positionAnimation.duration = 0.5;
运动线性
positionAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
动画的初始值-默认初始化的属性
positionAnimation.fromValue = [NSValue valueWithCGPoint:self.view.center];
动画的终止值
positionAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(CGRectGetMidX(self.view.bounds), 100)];
动画完成后是否回到原位,默认yes
positionAnimation.removedOnCompletion = NO;
positionAnimation.fillMode = kCAFillModeBoth;
决定当前对象在非active时间段的行为.比如动画开始之前,动画结束之后
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态.
kCAFillModeBackwards 在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始. 你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态
kCAFillModeBoth 这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状
添加动画
[self.view.layer addAnimation:positionAnimation forKey:@"position"];

animationWithKeyPath可选类型有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
transform.scale  比例转换
transform.scale.x 宽的比例轉換
transform.scale.y 高的比例轉換
transform.rotation.z 平面园的旋轉
opacity 透明度
margin 边缘
zPosition
backgroundColor    背景颜色
cornerRadius    圆角
borderWidth 边框宽度
bounds 大小
contents 内容
contentsRect 内容矩形
cornerRadius 圆角半径
frame 位置及尺寸
hidden 隐藏
mask 遮罩
masksToBounds 遮住边界
position 位置
shadowColor 阴影颜色
shadowOffset 阴影偏移
shadowOpacity 阴影透明度
shadowRadius 阴影半径

CAKeyframeAnimation 关键帧动画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CAKeyframeAnimation *keyFrameAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
keyFrameAnimation.duration = 2;
keyFrameAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
利用贝塞尔曲线绘制动画路径
UIBezierPath *path = [UIBezierPath bezierPath];
曲线起点
[path moveToPoint:self.view.center];
曲线轨迹(运动中将经过的点)
[path addLineToPoint:CPM(MID_X, MID_Y + 200)];
[path addLineToPoint:CPM(MID_X + 100, MID_Y + 200)];
闭合路径
[path addLineToPoint:CPM(MID_X + 100, MID_Y + 0)];
设置动画的路径
keyFrameAnimation.path = path.CGPath;
keyFrameAnimation.removedOnCompletion = NO;
keyFrameAnimation.fillMode = kCAFillModeForwards;
配置关键帧的时间控制-按照比例分配每一段运动轨迹时间
keyFrameAnimation.keyTimes = @[@"0.0",@"0.5",@"0.75",@"1.0"];

[self.view.layer addAnimation:keyFrameAnimation forKey:@"position"];

CAAnimationGroup 动画组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
例:组合两个基础动画
动画1
CABasicAnimation *positionAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
positionAnimation.fromValue = [NSValue valueWithCGPoint:self.view.center];
positionAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(CGRectGetMidX(self.view.bounds), 100)];
动画2
CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
opacityAnimation.fromValue = @(1.0);
opacityAnimation.toValue = @(0.4);
动画组
CAAnimationGroup *group = [CAAnimationGroup animation];
group.animations = @[positionAnimation,opacityAnimation];
group.duration = 1;
group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
group.removedOnCompletion = NO;
group.fillMode = kCAFillModeForwards;
[self.view.layer addAnimation:group forKey:@"group"];

渐变色

1
2
3
4
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = self.view.bounds;
gradientLayer.colors = @[(__bridge id)[UIColor colorWithRed:1.00 green:0.56 blue:0.00 alpha:1.00].CGColor,(__bridge id)[UIColor colorWithRed:0.26 green:0.79 blue:0.52 alpha:1.00].CGColor];
[self.view.layer addSublayer:gradientLayer];

Objective-C | 手势触摸

手势

建立手势对象

1
2
3
4
5
6
7
_animationView = [[UIView alloc]init];
_animationView.bounds = CGRectMake(0, 0, 200, 200);
_animationView.center = self.view.center;
_animationView.backgroundColor = [UIColor colorWithRed:0.21 green:0.6 blue:0.93 alpha:1];
[self.view addSubview:_animationView];
//打开用户交互 如果是imageView,则需要打开交互
_animationView.userInteractionEnabled = YES;

单击手势

1
2
3
4
1.初始化手势控制器-单击手势控制器
UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAnimationView:)];
2.为视图添加手势
[_animationView addGestureRecognizer:tapGes];

缩放手势

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
UIPinchGestureRecognizer *pinchGes = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchAnimationView:)];
[_animationView addGestureRecognizer:pinchGes];
缩放事件
- (void)pinchAnimationView:(UIPinchGestureRecognizer *)gesture
{
if (gesture.state == UIGestureRecognizerStateChanged) {
/*
UIGestureRecognizerStateBegan 开始-开始点击
UIGestureRecognizerStateChanged 改变-每一次移动手指
UIGestureRecognizerStateEnded 结束-手指挪开
*/
CGAffineTransformScale变幻效果的叠加的
当手势改变时执行缩放操作
gesture.view.transform = CGAffineTransformScale(gesture.view.transform, gesture.scale, gesture.scale);
保存缩放系数为1
gesture.scale = 1;
}
}

拖动手势

1
2
3
4
5
6
7
8
9
10
11
12
13
14
UIPanGestureRecognizer *panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panAnimationView:)];
[_animationView addGestureRecognizer:panGes];
拖动事件
- (void)panAnimationView:(UIPanGestureRecognizer *)gesture
{
if (gesture.state == UIGestureRecognizerStateChanged) {
获取手指在指定视图(self.view)的移动坐标
CGPoint transition = [gesture translationInView:self.view];
更新 _animationView 的center
gesture.view.center = CGPointMake(gesture.view.center.x + transition.x, gesture.view.center.y + transition.y);
把增量设置为0
[gesture setTranslation:CGPointZero inView:self.view];
}
}

触摸

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
触摸针对的是整个View,是视图控制器自带方法,用的时候直接重写
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
//拿到当前点击位置 通过UITouch
UITouch *nowTouch = touches.anyObject;
CGPoint location = [nowTouch locationInView:self.view];
//弹性动画
//usingSpringWithDamping 阻尼系数 0-1 越小越明显
//initialSpringVelocity 初始速度
[UIView animateWithDuration:0.2 delay:0 usingSpringWithDamping:0.5 initialSpringVelocity:0 options:0 animations:^{
//更新图片坐标-加动画
_imageView.bounds = CGRectMake(0, 0, 120, 120);
_imageView.center = location;
} completion:^(BOOL finished){
[UIView animateWithDuration:0.2 delay:0 usingSpringWithDamping:0.5 initialSpringVelocity:0 options:0 animations:^{
_imageView.bounds = CGRectMake(0, 0, 80, 80);
} completion:nil];
}];
}

Objective-C | 数据的外部储存和读取

设备存储路径

每一个App,iOS系统将会预设3个文件夹体感存储功能

  • documents路径
1
NSString *documentString = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
  • library路径
1
NSString *libraryString = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)lastObject];
  • tmp路径 - tmp作为临时存储,不向其中存储需要持久保留的数据
1
NSString *tmpString = NSTemporaryDirectory();

把工程中的图片写入沙盒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1.保存图片的路径
NSString *documentString = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
NSString *saveImagePath = [documentString stringByAppendingString:@“/图片名”];
2.获取图片
NSString *path = [[NSBundle mainBundle]pathForResource:@“图片名” ofType:@“png”];
UIImage *image = [UIImage imageWithContentsOfFile:path];
3.把图片转换为data
NSData *imageData = UIImagePNGRepresentation(image);
4.写入沙盒
NSFileManager *manager = [NSFileManager defaultManager];//单例
if (![manager fileExistsAtPath:saveImagePath]) {
[manager createFileAtPath:saveImagePath contents:imageData attributes:nil];
}

读取指定文件下的图片
[UIImage imageWithContentsOfFile:saveImagePath];

存储自定义对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
例子:存储联系人信息数组

存储
1.获取联系人对象
Contact *acontact = [[Contact alloc]initWithDictionary:[self userDic]];
2.获取保存文件路径
NSString *plistPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
plistPath = [plistPath stringByAppendingString:@"/data.plist"];
3.初始化写入沙盒的数组
NSMutableArray *dataList = [NSMutableArray array];
4.归档(自动调用归档方法)
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:acontact];
5.把归档所得数据添加的数组
[dataList addObject:data];
6.将数组写入沙盒
BOOL success = [dataList writeToFile:plistPath atomically:YES];
NSLog(@"是否保存成功:%d",success);

读取
1.获取保存文件的路径
NSString *plistPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
plistPath = [plistPath stringByAppendingString:@"/data.plist"];
2.读取沙盒文件
NSArray *results = [NSArray arrayWithContentsOfFile:plistPath];
3.解档
NSData *data = results[0];//取出data
Contact *acontact = [NSKeyedUnarchiver unarchiveObjectWithData:data];

删除
1.获取保存文件的路径
NSString *plistPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
plistPath = [plistPath stringByAppendingString:@"/data.plist"];
2.清除
NSFileManager *manager = [NSFileManager defaultManager];
BOOL success = [manager removeItemAtPath:plistPath error:nil];
NSLog(@"是否清除成功:%d",success);

NSUserDefaults 存沙盒

1
2
3
4
5

[[NSUserDefaults standardUserDefaults] setObject:@[@"1"] forKey:@"mydata"];
[[NSUserDefaults standardUserDefaults] synchronize];//同步至沙盒

NSArray *array = [[NSUserDefaults standardUserDefaults] objectForKey:@"mydata"];

Objective-C | 相册和相机

获取相册照片

1
2
3
4
5
6
7
8
9
- (void)selectAlbum {
UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
imagePicker.delegate = self;
//picker的资源类型
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//是否编辑照片
imagePicker.allowsEditing = YES;
[self presentViewController:imagePicker animated:YES completion:nil];
}

开启相机功能采集图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (void)takePhoto {
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
NSLog(@"error");
return;
}
UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
imagePicker.delegate = self;
//picker的资源类型
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
//是否编辑照片
//imagePicker.allowsEditing = YES;

[self presentViewController:imagePicker animated:YES completion:nil];
}

图片获得

1
2
3
4
5
6
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
//NSLog(@"%@",info);
_imageView.image = info[@"UIImagePickerControllerEditedImage"];
[picker dismissViewControllerAnimated:YES completion:nil];//选择完后隐藏选择图片功能
}

Objective-C | UI

UILaber

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
lable = [[UILabel alloc]initWithFrame:CGRectMake(0, 20, 375,30)];
lable.backgroundColor = [UIColor grayColor];
lable.text = @“laber”;
lable.textColor = [UIColor whiteColor];
lable.backgroudColor=[UIColor clearColor]; 
lable.textAlignment = NSTextAlignmentCenter;
//设置字体大小适应label宽度
lable.adjustsFontSizeToFitWidth = YES;
lable.font = [UIFont systemFontOfSize:18];
//字体大小,粗细
lable.font = [UIFont systemFontOfSize:18 weight:UIFontWeightThin];
//字体加粗,并设置字号
lable.font = [UIFont boldSystemFontOfSize:25];
//字体倾斜,并设置字号,对中文无效
lable.font = [UIFont italicSystemFontOfSize:25];
//设置高亮 
lable.highlighted = YES;     
lable.highlightedTextColor = [UIColor orangeColor];
//设置阴影
lable.shadowColor = [UIColor redColor];     
lable.shadowOffset = CGSizeMake(1.0,1.0); //偏移量
//设置是否能与用户进行交互     
lable.userInteractionEnabled = YES;   
//设置label中的文字是否可变,默认值是YES     
lable.enabled = NO;
//文字显示的最大行数
lable.numberofLines = 0
//numberofLines = 0 时设置文字过长时的显示格式     
lable.lineBreakMode = UILineBreakModeMiddleTruncation;//截去中间

UITextField

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(20, 100, 335, 34)];
//文本框的边框设定 个人觉得最后一种最好看
textField.borderStyle = UITextBorderStyleLine;
UITextBorderStyleNone,
UITextBorderStyleLine,
UITextBorderStyleBezel,
UITextBorderStyleRoundedRect
//文本框内默认文字
textField.text = @“11”;
//文本框内提示文字
textField.placeholder = @"请输入文本";
//设置输入框内容的字体样式和大小
textField.font = [UIFont fontWithName:@"Arial" size:20];
//设置字体颜色
textField.textColor = [UIColor redColor];
//设置输入框的背景颜色,如果使用了自定义的背景图片边框会被忽略掉 
textField.backgroundColor = [UIColor whiteColor];
//设置背景
textField.background = [UIImage imageNamed:@"dd.png"];
//设置disabled状态的背景 
textField.disabledBackground = [UIImage imageNamed:@"cc.png"];
//设置清除按钮模式
textField.clearButtonMode = UITextFieldViewModeAlways;
    UITextFieldViewModeNever, 从不出现
    UITextFieldViewModeWhileEditing, 编辑时出现
    UITextFieldViewModeUnlessEditing, 除了编辑外都出现
    UITextFieldViewModeAlways  一直出现
//是否纠错
textField.autocorrectionType = UITextAutocorrectionTypeNo;
UITextAutocorrectionTypeDefault, 默认
    UITextAutocorrectionTypeNo,  不自动纠错
    UITextAutocorrectionTypeYes, 自动纠错
//再次编辑就清空
textField.clearsOnBeginEditing = YES;
//内容对齐方式
textField.textAlignment = NSTextAlignmentLeft; // center/right
//内容的垂直对齐方式
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
//设置为YES时文本会自动缩小以适应文本窗口大小.默认是保持原来大小,而让长文本滚动 
textFied.adjustsFontSizeToFitWidth = YES;
//设置自动缩小显示的最小字体大小
textField.minimumFontSize = 20;
//设置键盘的样式
textField.keyboardType = UIKeyboardTypeNumberPad;
UIKeyboardTypeDefault,      默认键盘,支持所有字符         
    UIKeyboardTypeASCIICapable, 支持ASCII的默认键盘
    UIKeyboardTypeNumbersAndPunctuation, 标准电话键盘,支持+*#字符
    UIKeyboardTypeURL,            URL键盘,支持.com按钮 只支持URL字符
UIKeyboardTypeNumberPad,             数字键盘
UIKeyboardTypePhonePad,   电话键盘
    UIKeyboardTypeNamePhonePad,  电话键盘,也支持输入人名
UIKeyboardTypeEmailAddress,  用于输入电子 邮件地址的键盘     
UIKeyboardTypeDecimalPad,    数字键盘 有数字和小数点
    UIKeyboardTypeTwitter,       优化的键盘,方便输入@、#字符
//首字母是否大写
text.autocapitalizationType = UITextAutocapitalizationTypeNone;
    UITextAutocapitalizationTypeNone, 不自动大写
    UITextAutocapitalizationTypeWords, 单词首字母大写
    UITextAutocapitalizationTypeSentences, 句子的首字母大写
    UITextAutocapitalizationTypeAllCharacters, 所有字母都大写
//return键变成什么键
text.returnKeyType =UIReturnKeyDone;
UIReturnKeyDefault, 默认 灰色按钮,标有Return
    UIReturnKeyGo,     标有Go的蓝色按钮
    UIReturnKeyGoogle,标有Google的蓝色按钮,用语搜索
    UIReturnKeyJoin,标有Join的蓝色按钮
    UIReturnKeyNext,标有Next的蓝色按钮
    UIReturnKeyRoute,标有Route的蓝色按钮
    UIReturnKeySearch,标有Search的蓝色按钮
    UIReturnKeySend,标有Send的蓝色按钮
    UIReturnKeyYahoo,标有Yahoo的蓝色按钮
    UIReturnKeyYahoo,标有Yahoo的蓝色按钮
    UIReturnKeyEmergencyCall, 紧急呼叫按钮
//键盘外观
text.keyboardAppearance=UIKeyboardAppearanceDefault
UIKeyboardAppearanceDefault, 默认外观,浅灰色
UIKeyboardAppearanceAlert,   深灰 石墨色
//密码隐藏-安全输入模式
textField.secureTextEntry = NO;//默认NO,得手动开启
//文本自适应
[textField sizeToFit];
//回收键盘
[textField resignFirstResponder];

UIButton

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
//很多功能在选择系统风格时不能设置,所以尽量多写成自定义功能  
UIButtonTypeCustom = 0, 自定义风格
UIButtonTypeRoundedRect, 圆角矩形
UIButtonTypeDetailDisclosure, 蓝色小箭头按钮,主要做详细说明用
UIButtonTypeInfoLight, 亮色感叹号
UIButtonTypeInfoDark, 暗色感叹号
UIButtonTypeContactAdd, 十字加号按钮
//设置button标题和标题颜色
[button setTitle:@"点击" forState:UIControlStateNormal];
[button setTitleColor:[UIColorredColor]forState:UIControlStateNormal];
UIControlStateNormal = 0, 常规状态显现
UIControlStateHighlighted = 1 << 0, 高亮状态显现
UIControlStateDisabled = 1 << 1, 禁用的状态才会显现
UIControlStateSelected = 1 << 2, 选中状态
button.titleLabel.font = [UIFont systemFontOfSize: 25];
按钮边框宽度及颜色
[button.layer setBorderWidth:1.0]; //边框宽度
[button.layer setBorderColor:[UIColor colorWithWhite:1.0 alpha:0.8].CGColor];
设置按钮按下会发光
button.showsTouchWhenHighlighted=NO;
//设置字体颜色
[button setTintColor:[UIColor colorWithRed:0.16 green:0.16 blue:0.17 alpha:1]];
//按钮背景颜色
button.backgroundColor = [UIColor colorWithRed:0.24 green:0.71 blue:0.87 alpha:1];
//圆角
button.layer.cornerRadius = 10;
button.clipsToBounds = YES;
//文字位置
btn.contentHorizontalAlignment = UIControlContentHorizonAlignmentLeft;
//但是问题又出来,此时文字会紧贴到做边框,我们可以设置
btn.contentEdgeInsets = UIEdgeInsetsMake(0,10, 0, 0);
//添加或删除事件处理
  [button addTarget:self action:@selector(buttonTaped:) forControlEvents:UIControlEventTouchUpInside];
  [button removeTarget:nil action:nil forControlEvents:UIControlEventTouchUpInside];
//设置button填充图片和背景图片
[buttonsetImage:[UIImageimageNamed:@"xx"]forState:UIControlStateNormal];
[buttonsetBackgroundImage:[UIImageimageNamed:@"xx"]forState:UIControlStateNormal];
//方法的延迟调用
[self performSelector:@selector(jump) withObject:nil afterDelay:2];

UIImage & UIImageView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
主要使用 png 和 jpg
通过路径获取图片
NSString *path = [[NSBundle mainBundle]resourcePath]; 工程路径
NSString *imagePath = [NSString stringWithFormat:@“%@/1.png”,path];
UIImage *image = [UIImage alloc]initWithContentsOfFile:imagePath];
加载效率地,但是对内存需求低,针对比较大的图使用
通过名称获取图片
UIImage *image = [UIImage imageNamed:@“图片名(png),或者 图片名.jpg”];
这种方式的话,图片会被缓存到内存中,再次加载时,效率更高,当程序结束时,图片才会被释放,此方法对内存需求高
针对比较小而多的,而且使用次数多的图使用,比如qq表情包
图像旋转
UIImageOrientation myOrientation = Image.imageOrientation ;
可以设置以下方向:
typedef enum {
UIImageOrientationUp, // default orientation 默认方向
UIImageOrientationDown, // 180 deg rotation 旋转180度
UIImageOrientationLeft, // 90 deg CCW 逆时针旋转90度
UIImageOrientationRight, // 90 deg CW 顺时针旋转90度
UIImageOrientationUpMirrored, // as above but image mirrored along other axis. horizontal flip 向上水平翻转
UIImageOrientationDownMirrored, // horizontal flip 向下水平翻转
UIImageOrientationLeftMirrored, // vertical flip 逆时针旋转90度,垂直翻转
UIImageOrientationRightMirrored, // vertical flip 顺时针旋转90度,垂直翻转
} UIImageOrientation;
图片载体UI-ImageView
显示的图片的大小和比例是由载体控制的,所以最好在设置载体时使用 image.size.width/height,这样就不会被拉变形
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
imageView.frame:CGRectMake(0 ,0 , 100, 100);
注意:png格式的图片,镂空的地方会被设置为透明的,可以设置载体背景色
imageView.backgroundColor = [UIColor yellowColor];
圆角
imageView.layer.masksToBounds = YES;
imageView.layer.cornerRadius = 10;
边框
imageView.layer.borderColor = [UIColor orangeColor].CGColor;//颜色
imageView.layer.borderWidth = 2;//宽度
内容模式
imageView.contentMode = UIViewContentModeCenter;
图片居中显示,图片会保持原图大小,不再强制改成载体大小,
默认ModeScaleToFill-拉伸充满整个载体
ModeScaleAspectFill-拉伸但是不改变比例,充满最大的一边
ModeScaleAspectFit -拉伸但是不改变比例,充满最小的一边
播放一系列图片
UIImage *image1 = [UIImage imageNamed:@“1”];
UIImage *image2 = [UIImage imageNamed:@“2”];
UIImage *image3 = [UIImage imageNamed:@“3”];
NSArray *imagesArray = @[image1,image2,image3];
imageView.animationImages = imagesArray;
// 设定所有的图片在多少秒内播放完毕
imageView.animationDuration = [imagesArray count];
// 不重复播放多少遍,0表示无数遍
imageView.animationRepeatCount = 0;
// 开始播放
[imageView startAnimating];
为图片添加单击事件:
一定要先将userInteractionEnabled置为YES,这样才能响应单击事件
imageView.userInteractionEnabled = YES;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapImageView:)];
[imageView addGestureRecognizer:singleTap];
其他
imageView.hidden = YES或者NO;    // 隐藏或者显示图片
imageView.alpha =0.5;    // 设置透明度
设置高亮时显示的图片
imageView.highlightedImage = (UIImage *)hightlightedImage;
设置正常显示的图片
imageView.image = (UIImage *)image;

UIScrollView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//初始化scrollView
_scrollView = [[UIScrollView alloc]init];
_scrollView.bounds = CGRectMake(0, 0, SCREEN_W, 250);
_scrollView.center = self.view.center;
//设置滚动视图内容的大小,即用来盛放其他view的画布,必须比手机屏幕大才能有滚动效果
_scrollView.contentSize = CGSizeMake(SCREEN_W * 3, 250);
//设置分页
_scrollView.pagingEnabled = YES;
//是否显示指示条
_scrollView.showsHorizontalScrollIndicator = NO;
//加了导航栏后,会自动把滚动视图往下移动一个导航栏的高度,可手动关掉该效果
//关闭导航栏透视效果
self.automaticallyAdjustsScrollViewInsets = NO;
//初始化滚动视图中第一个视图-CGPoint类型
_scrollView.contentOffset = CGPointMake
_scrollView.contentOffset.x/y 可查看滚动视图当前所显示视图的坐标
//滚动响应方法得使用<UIScrollViewDelegate>协议中的方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
//滚动视图的带动画的跳转,CGPoint类型,
[_scrollView setContentOffset:CGPointMake(x,x) animated:YES];

UIPageControl

1
2
3
4
5
6
7
8
9
10
11
12
@property(nonatomic,strong)UIPageControl *pageControl;
//初始化分页控件
_pageControl = [[UIPageControl alloc]init];
_pageControl.bounds = CGRectMake(0, 0, SCREEN_W, 30);
_pageControl.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds) + 100);
//总页数
_pageControl.numberOfPages = 3;
//当前指示页
_pageControl.currentPage = 0;
//设置当前指示器小圆点颜色
_pageControl.currentPageIndicatorTintColor = [UIColor orangeColor];
[self.view addSubview:_pageControl];

UITableView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//使用属性声明
@property(nonatomic,strong)UITableView *tableView;
//初始化表格视图
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
_tableView.rowHeight = 50;
[self.view addSubview:_tableView];
//加载表格视图内容,设置延迟加载,为了效果
[self performSelector:@selector(loadDataSource) withObject:nil afterDelay:1];
//表格视图数据源为数组,通常进行属性申明为可变数组
//刷新表格,重新执行一遍数据源协议方法
[_tableView reloadData];

UITableViewDataSource协议
必须执行方法
//指定分区有多少行(默认只有一个分区)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 行数;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//table view的重用机制
//1.声明一个可重用标识符
static NSString *cellIdentifer = @"mycell";
//2.从队列中拿出一个可重用的特殊cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifer];
if (!cell) {
//3.如果cell没有被初始化,则初始化它
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifer
];
}
//获取当前分区对应的字体数组
NSArray *fontArray = _dataDource[_allKeys[indexPath.section]];
cell.textLabel.text = fontArray[indexPath.row];
cell.textLabel.font = [UIFont fontWithName:fontArray[indexPath.row] size:16];
return cell;
}
不必须执行方法
//设置表格有多少个分区
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 分区数;
}

UITableViewDelegate协议
按钮动态特效+push跳转
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//取消cell选中的颜色
[tableView deselectRowAtIndexPath:indexPath animated:YES];
//获取当前点击的cell
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

FontDetailViewController *fontDetail = [[FontDetailViewController alloc]init];
fontDetail.fontName = cell.textLabel.text;
[self.navigationController pushViewController:fontDetail animated:YES];
}
//设置分区高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 30.0;
}
//设置分区标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return 标题;
}

下拉刷新动态旋钮
用属性申明
//下拉刷新控件(系统自带)
@property (nonatomic,strong)UIRefreshControl *refreshControl;
初始化
_refreshControl = [[UIRefreshControl alloc]init];
_refreshControl.attributedTitle = [[NSAttributedString alloc]initWithString: @"下拉刷新"];
添加响应控件
[_refreshControl addTarget:self action:@selector(beginRefreshData) forControlEvents:UIControlEventValueChanged];
[_tableView addSubview:_refreshControl];
开始进行
- (void)beginRefreshData{ }在其中写在刷新动画进行中进行的操作
停止进行 [_refreshControl endRefreshing];

UICollectionView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//配置collectionview的布局
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
//配置滚动方向
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
UICollectionViewScrollDirectionVertical,垂直滚动
UICollectionViewScrollDirectionHorizontal 水平滚动
//设置item的尺寸
layout.itemSize = CGSizeMake(110, 110);
//item之间的最小间距
layout.minimumInteritemSpacing = 3;
//item之间的最小间距
layout.minimumLineSpacing = 10;
//设置header的尺寸
layout.headerReferenceSize = CGSizeMake(100, 30);//宽度默认与UICollectionViewFlowLayout一样
//设置footer的尺寸
layout.footerReferenceSize = CGSizeMake(100, 30);
//根据布局,初始化CollectionView
UICollectionView *collectionView = [[UICollectionView alloc]initWithFrame:self.view.bounds collectionViewLayout:layout];
//背景色
collectionView.backgroundColor = [UIColor colorWithRed:0.96 green:0.96 blue:0.96 alpha:1];
//设置内偏移量
collectionView.contentInset = UIEdgeInsetsMake(0, 10, 0, 10);
//注册cell
[collectionView registerClass:[CustomCollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
//注册header - 可重用视图类
[collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"];
//注册footer
[collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"footer"];
//数据源协议
collectionView.dataSource = self;
collectionView.delegate = self;

[self.view addSubview:collectionView];

UICollectionViewDataSource协议
//item个数
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return _dataSource.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
//重用机制,此处标志符sell必须和上面标志符一样
CustomCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
//配置cell的显示
//cell.backgroundColor = _dataSource[indexPath.row];
return cell;
}

UISwitch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UISwitch *switchControl = [[UISwitch alloc]init];
switchControl.bounds = CGRectMake(0, 0, 60, 30);
switchControl.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds)-200);
设置开关是否开启-初始状态
switchControl.on = NO;
主色调-边框颜色
switchControl.tintColor = [UIColor greenColor];
开启区域的颜色
switchControl.onTintColor = [UIColor blueColor];
开关按钮颜色
switchControl.thumbTintColor = [UIColor yellowColor];
//开关点击事件
//开关本质上是值(bool)的改变
[switchControl addTarget:self action:@selector(controlProgress:) forControlEvents:UIControlEventValueChanged];
响应方法 判定 switchControl.on 是否为真来判定状态

UISegmentedControl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc]initWithItems:@[@"white",@"blue",@"red"]];
通过数组存储要展示的部件
segmentedControl.bounds = CGRectMake(0, 0, 370, 30);
segmentedControl.center = self.view.center;
//设置默认选中项
segmentedControl.selectedSegmentIndex = 0;//对应数组下标
//设置字体颜色
segmentedControl.tintColor = [UIColor grayColor];
//设置字体颜色
//[segmentedControl setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor blackColor]} forState:UIControlStateNormal];
[segmentedControl addTarget:self action:@selector(controlProgress:) forControlEvents:UIControlEventValueChanged];
响应方法
通过 segmentedControl.selectedSegmentIndex 获取对应下标,再新建数组来取对应值
NSArray *colors = @[[UIColor whiteColor],[UIColor blueColor],[UIColor redColor]];
self.view.backgroundColor = colors[segmentedControl.selectedSegmentIndex];

UISlider

1
2
3
4
5
6
7
8
9
10
11
12
UISlider *slider = [[UISlider alloc]init];
slider.bounds = CGRectMake(0, 0, 335, 50);
slider.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds) - 120);
//设置最小/最大值
slider.minimumValue = 0.1;
slider.maximumValue = 1.0;
//初始值
slider.value = 0.5;
//最小/最大值颜色
slider.maximumTrackTintColor = [UIColor greenColor];
slider.minimumTrackTintColor = [UIColor grayColor];
[slider addTarget:self action:@selector(controlProgress:) forControlEvents:UIControlEventValueChanged];

UIProgressView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@property(nonatomic,strong)UIProgressView *progressView;
_progressView = [[UIProgressView alloc]init];
_progressView.bounds = CGRectMake(0, 0, 300, 50);
_progressView.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds) + 100);
设置进度条风格样式
_progressView.progressViewStyle = UIProgressViewStyleDefault;
//UIProgressViewStyleDefault,
//UIProgressViewStyleBar
初始进度。默认0.0
_progressView.progress = 0.0;
走过部分颜色
_progressView.tintColor = [UIColor blueColor];
设置进度条进度和是否动画显示(动画显示会平滑过渡)
[_progressView setProgress:1.0 animated:YES];

UIStepper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
iOS中步进控件的简单使用
初始化控件
UIStepper *step = [[UIStepper alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
设置控制器值是否连续触发变化
@property(nonatomic,getter=isContinuous) BOOL continuous;
若设置为YES,则长按会连续触发变化,若设置为NO,只有在按击结束后,才会触发。
设置长按是否一直触发变化
@property(nonatomic) BOOL autorepeat; 
若设置为YES,则长按值会一直改变,若设置为NO,则一次点击只会改变一次值
设置控制器的值是否循环(到达边界后,重头开始,默认为NO)
@property(nonatomic) BOOL wraps;
设置控制器的值
@property(nonatomic) double value; 
设置控制器的最大值和最小值
@property(nonatomic) double minimumValue;//默认为0
@property(nonatomic) double maximumValue; //默认为100
设置控制器的步长
@property(nonatomic) double stepValue; 
设置控制器风格颜色
@property(nonatomic,retain) UIColor *tintColor;
设置控制器背景图片
- (void)setBackgroundImage:(UIImage*)image forState:(UIControlState)state;
获取背景图片
- (UIImage*)backgroundImageForState:(UIControlState)state;
通过左右按钮的状态设置分割线的图片
- (void)setDividerImage:(UIImage*)image forLeftSegmentState:(UIControlState)leftState rightSegmentState:(UIControlState)rightState;
获取分割线图片
- (UIImage*)dividerImageForLeftSegmentState:(UIControlState)state rightSegmentState:(UIControlState)state;
设置和获取加号按钮的图片
- (void)setIncrementImage:(UIImage *)image forState:(UIControlState)state;
- (UIImage *)incrementImageForState:(UIControlState)state;设置和获取减号按钮的图片
- (void)setDecrementImage:(UIImage *)image forState:(UIControlState)state;
- (UIImage *)decrementImageForState:(UIControlState)state;

UIAlertController

1
2
3
4
5
6
7
UIAlertControllerStyleAlert  //弹出到中间
UIAlertControllerStyleActionSheet // 从下升起
UIAlertController *loginAlertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"是否注销登录,注销后将无法使用部分功能" preferredStyle:UIAlertControllerStyleAlert];
[loginAlertController addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
}]];
[loginAlertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:loginAlertController animated:YES completion:nil];

UIActivityIndicatorView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@property (nonatomic,strong)UIActivityIndicatorView *indicatorView;
初始化活动指示器
_indicatorView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
UIActivityIndicatorViewStyleWhiteLarge, 大白
UIActivityIndicatorViewStyleWhite, 白
UIActivityIndicatorViewStyleGray 灰

_indicatorView.bounds = CGRectMake(0, 0, 30, 30);
_indicatorView.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds) + 150);
_indicatorView.backgroundColor = [UIColor blueColor];
设置背景透明
_indicatorView.alpha = 0.5;
设置背景为圆角矩形
_indicatorView.layer.cornerRadius = 6;
_indicatorView.layer.masksToBuounds = YES;
//当动画停止后是否自动隐藏控件
_indicatorView.hidesWhenStopped = YES;
[_indicatorView startAnimating] 开始
[_indicatorView stopAnimating] 停止

UIDatePicker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@property (nonatomic,strong) UIDatePicker *datePicker;
//初始化
_datePicker = [ [ UIDatePicker alloc] initWithFrame:CGRectMake(0,447,375,220)];
_datePicker.backgroundColor = [UIColor groupTableViewBackgroundColor];
//显示项目
_datePicker.datePickerMode = UIDatePickerModeDateAndTime;
//时间间隔
_datePicker.minuteInterval = 1;
//时区
[_datePicker setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"zh_Hans_CN"]];

//获取选择时间
NSDate *pickDate = [_datePicker date];
NSDateFormatter *pickFormatter = [[NSDateFormatter alloc]init];
[pickFormatter setDateFormat:@"yy年MM月dd日-HH:mm:ss"];
NSString *dateString = [pickFormatter stringFromDate:pickDate];
_showLable.text = dateString;

Objective-C | 继承,方法,多态

继承

面对对象的重要语法,OC只支持单继承

特点:

  • 使用继承可以实现代码的复用,减少代码亢余,

  • 子类可以同时拥有父类中所有哦允许子类继承的成员和方法

  • 子类可以改变父类中已有的方法

self

在类的方法中替代自身,替代调方法的角色,可以直接调用本类或父类的方法

super

在类的方法中替代父类,只能用来调用父类的方法,类中方法名与父类相同时,若想调用父类的方法时,只能使用super

多态

多态即为 接口的多种不同的实现方式,不同对象对同一消息的不同响应子类可以重写父类的方法,

多态允许方法重名,参数或返回值可以是父类型传入或返回

方法

-方法 调用 [对象 方法名]

+方法 调用 [类名 方法名]

setter,gettter 方法

1
2
3
4
5
6
7
8
9
- (void)setName:(NSString *)name
{
_name = name;
}

- (NSString *)name
{
retrun _name;
}

重写description修改 %@ 的输出格式

Objective-C | 集合类

集合类

集合类特点:

  • 所有的集合都是对象

  • 集合中所有的元素都是对象而且只能是对象

  • 简单数据类型用NSNumber封装成对象,复杂数据类型用NSValue封装

  • 集合中不能存放nil对象,nil是作为集合结束的标志符

  • OC集合没有多维的概念,不会出现根本意义上的二维数组

  • 集合的所有运算依赖于方法

数组NSArray

c语言数据类型(int,float,double,BOOL)要封装成NSNumber类型后,才能存在集合中

NSArray 不可变数组

  1. 初始化
1
2
3
4
5
6
[[NSArray alloc]initWithObject:@“1”,@“2”,@“3”,nil]	
[[NSArray alloc]initWithArray:array1];
[NSArray arrayWithObject:@“1”,@“2”,@“3”,nil]
[NSArray arrayWithArray:array1];
简化操作:NSArray = @[@“1”,@“2”,@“3”];
标记static的数组,不能使用简写赋值
  1. 获取数组元素个数
1
2
[array count];		
array.count
  1. 添加元素
1
2
[array arrayByAddingObject:@“4”];	
[array arrayByAddingObjectFromArray:array1];
  1. 查找元素
1
2
NSInteger index = [array indexObject:@“3”];	
index == NSNotFound;
  1. 获取元素
1
2
3
4
5
6
7
8
9
//存入的是什么类型,取出就用什么类型接受	
array[0];
[array objectAtIndex:0];
//获取第一个元素
[array firstObject];
//获取最后一个元素
[array lastObject];
//获取部分元素
NSArray *getArray = [array subarrayWithRange”NSMakeRange(0,2)];
  1. 排序

  2. 快速枚举

1
2
3
for(id obj in newArray){ 	
NSLog(@“obj = %@”,obj);
}

NSMutableArray 可变数组

  1. 初始化

基本同上,不能直接使用简化方法,

1
2
NSMutableArray *array = [@[@“1”,@“2”]mutableCopy];
额外一种, [NSMutableArray arrayWithCapacticy:20]; 分配容量
1
[mutableArray addObject:@“0”];	
1
[mutableArray removeObject:@“2”];	
1
[mutableArray indexOfObject:@“0”];	查出在数组中的位置
1
[mutableArray replaceObjectAtIndex:2 withObject:@“0”];	改数组中对应位置的元素	
  1. 排序

字典NSDictionay

关键字及其定义的集合,字典也被称为 散列表或关联数组

  • NSDictionay | value - key

1.初始化

一般初始化:NSDictionary *dictionary = [[NSDictionary alloc]initWithObjectsAndKeys:@“one”,@“1”,@“two”,@“2”,nil];

便利初始化: NSDictionary *dictionary = [NSDictionary dictionaryWithObjectAndKeys:@“one”,@“1”,@“two”,@“2”,nil];

快速初始化: NSDictionary *dictionary = @[@“1”:@“one”,@“2”:@“two”];

2.查询 [dictionary objectForKey:@“2”]; dictionary[@“2”];

3.取出所有key NSArray *key = [dictionary allKeys];

4.取出所有对象 NSArray *objects = [dictionary allValue];

  • NSMutableDictionay
  1. 初始化-基本同上

1
[mutableDictionary setObject:@“six” forKey:@“6”];	
1
[mutableDictionary removeObjectForKey:@“6”];	
1
[mutableDictionary objectForKey:@“4”];
  1. 改(根据Key值覆盖之前的数据)
1
[mutableDictionary setObject:@“sunny” forKey:@“4”];
  1. 遍历
1
2
3
for(id key in mutableDictionary) {	
NSLog(@“%@”,[mutableDictionary objectForKey:Key])
}
  • NSSet

里面的对象不能存放重复的对象,主要用于去除重复数,可用来清除其它集合中的重复对象

1
2
3
4
5
去除重复数	
NSArray *array = @[@“1”,@“1”,@“2”,@“3”,@“3”,@“4”];
NSSet *set = [NSSet setWithArray:array];
NSArray *arraySet = [set allObject];
得到的 arraySet 就是去除重复元素之后的数组

Objective-C | 内存管理

内存管理

内存管理的原理:

​ 保证每个对象在使用时存在内存中,不用的对象最后从内存中清除一个对象的生命周期

​ 对象初始化 -> 执行,使用 -> 释放内存管理只针对继承NSObject的对象,对C数据类型无效

retainCount引用计数

  1. 每个OC对象都有自己的引用计数器,retainCount
  2. 当对象被创建时,引用计数置为1
  3. retain使对象引用计数加1,并获得对象的所有权
  4. release使对象引用计数减1,并放弃对象的所有权
  5. 当引用计数为0时,对象将被系统销毁
1
2
3
4
5
6
retainCount:获取对象当前的引用计数	
alloc:返回一个对象,并将其引用计数设置为1,类方法
retain;将对象的引用计数加1
release:对象的引用计数减1
autoreplease:将对象加入自动释放池,对象引用计数滞后减1
dealloc,不主动调用,需要在类中重写

在非ARC模式下,进行内存管理

  • 内存管理仅仅使用于对象类型,数据类型无需进行内存管理
  • 使用alloc,new,copy,mutableCopy生成的对象,对象初始引用计数值为1,手动释放内存(堆)
  • 使用便利初始化生成的对象,对象初始引用计数值为1,并且已经设置为自动释放(栈)
  • 使用retain持有的对象,需要保证retain和release次数相等

setter,getter内存管理

1
2
3
4
5
6
7
8
9
- (void)setName:(NSString *)name	{
if(name != name){
[name release]; //释放旧对象,持有新对象
_name = [name retain];
}
}
- (NSString *)name {
retain _name;
}

自定义初始化

自定义初始化方法中:

1
2
3
if(self){
_name = [name retain];
}

集合内存管理:字典,数组

  1. 对象加入集合对象时,+1
  2. 对象从集合对象中移除,—1
  3. 集合对象的retainCount改变,其中元素的retainCount不变
  4. 集合对象销毁时,其中所有元素release一次

自动释放池NSAutoreleasePool

  • 类似于一个容器,所有加入容器中的对象都可以被其管理,容器销毁时,池将会释放(release)所有对象
  • 一个对象可以被多次autorelease
  • 便利初始化的对象默认已经加入当前池中
1
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

Objective-C | 常用的设计模式,引用和传值

单例模式

单例是生命周期与程序生命周期相同,仅能生成一次,且不能被销毁的唯一实例

单例设计模式要点

  1. 某个类只能有一个实例

  2. 必须自行创建这个对象

  3. 必须自行向整个系统提供这个实例

  4. 该方法必须是一个静态类

单例的创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
当例一般以default,share,standard,getinstance开头

.h
@property (nonatomic,strong) NSString *name;

//创建单例
//单例:以default,share,standard,getinstance开头
+ (Singleton *)shareInstance;

.m
//创建单例
+ (Singleton *)shareInstance
{
if (!instance) { //(instance == nil)保证第一次创建成功后不再新建对象
instance = [[Singleton alloc]init];
}
return instance;
}
//全套安全单例的创建,NSObject<NSCopying>
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
@synchronized(self) { 只能开辟一次空间

if (!instance) {
instance = [super allocWithZone:zone];
}
}
return instance;
}

- (id)copyWithZone:(NSZone *)zone
{
return self;
}

- (instancetype)retain
{
return self;
}

- (oneway void)release
{

}

- (instancetype)autorelease
{
return self;
}

- (NSUInteger)retainCount
{
return NSUIntegerMax;
}

GCD创建单例写法

观察者模式

事件响应

  • KVC

    通过字符串描述来更改对象状态

    存取通过属性或者直接设置实例变量来直接更改对象状态

    -valueForKey -setValue:forKey

  • KVO

    建立在KVC之上,能够观察一个对象KVC key path 值的变化

数据的持久化(数据存储) - NSUserDefaluts

1
2
3
4
5
NSUserDefaluts *userDefaults = [NSUserDefaluts standardNSUserDefaluts];	
存数据: [userDefaults setObject:@“tom” forKey:@“name”];
取数据: [userDefaults objectForKey:@“name”];
删数据: [userDefaults removeObjectForKey:@“name”];
更新数据同步文件 [userDefaults synchronize];

读写文件

可以通过代码,根据路径创建文件,来存储数据,这时数据不是存储在沙盒中

1
2
存:[array writeToFile:@“路径名/文件名.后缀名” atomically:YES];	
取: [NSArray arrayWithContentsOfFile:@“路径名/文件名.后缀名”];

Objective-C | 属性

属性

属性的声明

@property 关键字,声明一个属性

属性参数

1
2
3
4
5
6
7
8
9
内存管理相关 	
assign:缺省型,修饰基本数据类型和delegate对象,表示无需进行任何内存管理
retain:对象类型,持有对象,引用计数+1
copy:对象类型(NSCopying),持有对象,对象不可变复制 线程相关
atomic:关心线程安全,通常用于多线程,原子性
nonatomic:不关心线程安全,用于单线程,非原子性 读写/只读
readwrite:可读取,可改写
readonly:只读,提供getter方法,不提供setter方法
strong = retain | weak = assign

原子性:要么完整的被执行,要么完全不执行

属性的应用

用属性声明后就会自带setter,getter方法,可以直接使用点语法

copy关键字

当使用不可变类型的属性时,等同于strong,当使用可变类型时,每次赋值都会拷贝一个新的对象

深复制:内容复制,编译器会开辟新的内存来存储复制对象的数据,复制对象retaincount默认为1,需手动释放

浅赋值:指针赋值,只是将对象的引用计数加1,需要手动释放

copy:不可变复制,若对象时不可变的是浅复制,若对象时可变的是深复制,且复制对象不可变

mutableCopy:可变复制,无论对象可变还是不可变都是深复制,复制的对象可变