iOS中UI阶段常用的一些方法


UI 即 UserInterface(用户界面
1.iOS系统版本,每年都有更新.对我们开发者而言,主要的是观察API的变化.
2.iPhone新手机发布,会产生不同尺寸的屏幕,现在市面上有4种尺寸,我们需要考虑屏幕适配问题.
3.iOS系统层级,分为4层.目前我们学习的就是最顶层Cocoa touch层(layer),我们使用的是UIKit框架
4.iOS SDK(软件开发工具包).iOS开发语言OC,Swift——都是面向对象.

5.我们最简单的创建UI项目的方法就是通过storyboard(故事版)来完成.
6.我们可以通过设置故事板上面的控件属性(右边栏,第四个按钮——属性设置)

7.
—模拟器的输入模式切换:command+shift+K
—模拟器大小的切换:command+1,2,3
—模拟器锁屏:command+L
—模拟器Home键:command+shift+H


www.stackOverFlow.com
github.com
cocoaChina.com
code4app.com
编程查资料最好用Google
 
 
 
 
 
 
 
 
 
一.程序的生命周期
 
 1.程序已经完成启动。在这个方法里完成项目必要的界面加载
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
创建Xcode工程选中singleView模板,并且做好相应设置,设置好主窗口,和主窗口的根控制器。相当于该方法隐藏的设置好了上述。
2.程序将要辞去活跃状态(进入非活跃状态)
- (void)applicationWillResignActive:(UIApplication *)application
程序不再是用户可以操作的时候,进入非活跃(双击Home键)
 
 暂停游戏(在这里暂停一些任务)
3.程序已经进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application
 程序完全看不见了,进入后台。程序挂起
 程序由用户自己结束的时候,先进入后台
 4.程序将要进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application
从后台进入前台就会调用这个方法
 重新开始被暂停的游戏(游戏继续)
5.程序已经变为活跃
- (void)applicationDidBecomeActive:(UIApplication *)application 
        1.在程序启动的时候会调用一次。
        2.从后台回到前台
        3.从任务管理界面回到前台
6.程序将要结束
- (void)applicationWillTerminate:(UIApplication *)application
·1. 程序结束的时候
 2. 程序自己崩溃的时候
 3.如果时机合适,你可以做一些数据储存类的工作
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
  程序接受到内存警告(系统发送,如果一直占用过高,系统会直接杀掉进程)
 
 
二.登录界面
 
1.视图已经加载(视图控制器完成它所拥有的视图加载)
- (void)viewDidLoad {      [super viewDidLoad];.......在这行代码之后,添加额外的控件}
2.改变视图的背景颜色(UIColor 颜色对象)
 self.view.backgroundColor = [UIColor greenColor];
3.设置标签的文本内容      logInLabel.text = @"登录界面";
4.设置文本内容对齐方式,碰到不认识的属性(类)按住Command点进去看
 logInLabel.textAlignment = NSTextAlignmentCenter;
5.将label放到屏幕上,给视图添加一个子视图(参数是要添加的视图对象)
 [self.view addSubview:logInLabel];
6.计算、更新密码输入框所需要的结构体
 // 不能直接更改结构体内部的值,所以我们用一个新的变量取出这个结构体
 CGRect rect = passwordLabel.frame;
 // 改变CGRect类型结构体的原点x值
 rect.origin.x += 65.0;
 // 改变CGRect类型结构体的宽度值
三.启动界面与启动图
 
1.启动界面:App lcons Source —>用App prepo将图片处理成2x,3x的格式,然后将图片拖入到Apploce当中,最后在运行。
2.启动图:
        方法一:首先将图片直接拖入到Xcode当中,然后在LaunchScreen.storyboard当中,点击界面,然后选择size,确定屏幕的大小,在viewController中将Image View拖入到界面当中,将图片放大到与屏幕同大小,最后在Image当中导入图片。
 
        方法二:在Xcode中进入项目Launch  Image Source —>Use Asset Catalog —>migrate,点击箭头,最后将图片导入。
 
四.iOS坐标系
1. 创建一个Label,放在屏幕上
 UILabel * label = [[UILabel alloc] init];
2.设置label的位置信息
   CGRectMake()
  @param X 横轴坐标
  @param Y 纵轴坐标
  @param width 视图的宽度
  @param height 视图的高度
3. 创建window ,设置window的大小为屏幕大小
 self.myWindow1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 20)];
 
 4.设置window的背景颜色
 self.myWindow1.backgroundColor = [UIColor blackColor];
 
 5.设置成app的主窗口并且可见
 [self.myWindow1 makeKeyAndVisible];
 
 6. 设置window的根控制器
  self.window.rootViewController = [[UIViewController alloc] init];
 self.myWindow1.rootViewController = [[ViewController alloc] init];
 self.myWindow1.windowLevel = UIWindowLevelStatusBar;
7. 一个窗口创建之后,默认是normal级别
 如果调整窗口的级别,会改变显示顺序
self.myWindow1.windowLevel = UIWindowLevelStatusBar;
状态栏其实是一个很小的窗口,他的级别是 UIWindowLevelStatusBar
8..视图:将子视图放到父视图上的时候,坐标系以父视图左上角为原点
  .默认!子视图是可以超出父视图的范围的
9.frame, bounds和Center
            frame得到的范围,是以父视图为参照(决定位置和尺寸)
            bounds以自身为参照(决定视图的尺寸)
             Center 以父视图为参照(决定视图的位置)
10.bounds就是frame的原点为0的值是错的,比如在旋转当中。
 
11.回收键盘
[self.numberTextField1 resignFirstResponder];    单个文件输入结束之后回收键盘
 [self.view endEditing:YES];   全部输入结束之后回收键盘 
 
12.如果需要应用到数字的时候,首先将text文本转化为整型数据,然后再计算等,最后再将结果转化为字符串的形式,并且赋值给所要结果的地方
 
13.Ctrl +windows+方向键    实现类的切换
 
14. 将视图添加到窗口上, 获取程序的包(和项目源代码文件夹不同)
 NSBundle * bundle = [NSBundle mainBundle];
 
15. 获取包目录    bundle.bundlePath;
 
 加载包里面的Nib文件,返回值是数组,里面存了很多个view
 /*
  * 加载包中的Nib文件
  * 
  * @param NSString Nib文件的名称
  * @param id 加载出来的文件所有者
  * @param NSDictionary 加载的时候所需要的附加信息
  */
 NSArray * viewArray = [bundle loadNibNamed:@"View" owner:self options:nil];
 
16. 获取数组中的视图
 [viewArray firstObject];         UIView * view = viewArray[0];
 
 17.添加上去作为子视图
 [self.window addSubview:view];
 
五.xib加载视图
 
1.首先创建一个xib,iOS—>User Interface—View,
 
2. 将视图添加到窗口上, 获取程序的包(和项目源代码文件夹不同)
 NSBundle * bundle = [NSBundle mainBundle];
3. 获取包目录       bundle.bundlePath;
4.加载包里面的Nib文件,返回值是数组,里面存了很多个view,加载包中的Nib文件
   @param NSString Nib文件的名称
  @param id 加载出来的文件所有者
  @param NSDictionary 加载的时候所需要的附加信息
  NSArray * viewArray = [bundle loadNibNamed:@"View" owner:self options:nil];
5. 获取数组中的视图 
         [viewArray firstObject];    UIView * view = viewArray[0];
6. 添加上去作为子视图   [self.window addSubview:view];
六 .视图树
 
1.视图的层次结构:一个视图可以拥有几个子视图,但一个视图只能拥有一个父视图。
2.建立层级关系:父子关系,子视图会覆盖父视图,同层级的子视图,如果发生堆叠,那么根据先后顺序来摆放(先添加的在下面,后添加的在上面)。
3. 添加一个子视图,放入指定的索引位置
 [baseView insertSubview:insertSubview1 atIndex:2];
4.指定在XX视图之上
        [baseView insertSubview:insertSubview1 aboveSubview:subView1];
5.如果使用insertSubview:aboveSubview: 父视图和基于的子视图为相同,那么相当于直接添加
        [baseView addSubview:insertSubview1];
6.指定在XX视图之下
         [baseView insertSubview:insertSubview1 belowSubview:subView2];
7.延迟调用方法
[self performSelector:@selector(test:) withObject:subView2 afterDelay:5];
 @param SEL 方法签名
  * @param id 附带的参数
  * @param delay 延迟的时间间隔
 
8. 调整已有视图层次结构 Exchang : 交换
 [baseView exchangeSubviewAtIndex:<#(NSInteger)#> withSubviewAtIndex:<#(NSInteger)#>]
 9.拿到最前面
[baseView bringSubviewToFront:<#(nonnull UIView *)#>]
10. 送到最后面
 [baseView sendSubviewToBack:<#(nonnull UIView *)#>]
11.获取一个视图的子视图数组和父视图
 父视图.subviews      子视图.superview
七。UIView的常用属性
 
1.通过tag值在视图树中找到相应的视图
 UIView * view = [self.view viewWithTag:1001];
2. red green blue alpha(透明度)
      RGB 值范围0~255 但在这里范围是0~1
       alpha 透明度 范围0~1
0 - 1,默认是1 表示不透明,0全透明,透明度会影响子视图
 baseView.alpha = 0.5;
 
     [UIColor colorWithRed:255/255.0 green:0/255.0 blue:0/255.0 alpha:100];
3. 透明色      [UIColor clearColor];
4.设置背景颜色
         baseView.backgroundColor = [UIColor redColor];
5.视图是否隐藏(YES表示隐藏:默认为NO)  default: 默认
             baseView.hidden = YES;
6.给视图对象添加标记
baseView.tag = 1002;
八.坐标系统的转换
 
1.拿到视图的transform 
 
CGAffineTransform  transform =self.变化的属性名.transform;
定义CGAffineTransform 变量,CGAffineTransform   t
2.构造一个在原有基础上平移的transform
 
   * 具有返回值,CGAffineTransform类型
   * @param transform 基于的transform
   * @param tx x轴变换
   * @param ty y轴变换
  
  t = CGAffineTransformTranslate(transform, 0, 50);
3.在原有基础上旋转的transform
t=CGAffineTransformRotate(transform, 角度M_PI)     
4.缩放
self.属性名.transform=CGAffineTrandformScale(self.属性名.transform,x轴缩放距离,y轴缩放距离)
5.产生效果    赋给要移动的对象transform      sel.属性名.transform =t
 
九.属性动画
 
1.设置图片,附带图片名称,默认只支持.png格式,其他格式需要加上后缀,最后在添加到视图上。
 
self.imageView.image=[UIVmage imageNamed:@“图片名称”];
 
一.首尾式动画
1.标记动画的开始
 [UIView beginAnimations:nil context:nil];
 
2.设置动画的属性
 [UIView setAnimationDuration:0.8];   时间   
 
 [UIView setAnimationRepeatCount:100];      重复次数  
 
 [UIView setAnimationRepeatAutoreverses:YES];     是否返回
3.动画的结束      [UIView commitAnimations];
 
二.block动画
 
1.[UIView animateWithDuration:0.8 animations:^{
 block中也可以添加动画属性
  [UIView setAnimationRepeatCount:100];
 
 这里写动画的内容
  self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, M_PI_4);
 }];
 
 self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, 0, 50);
 
 
 设置一段完成之后的回调
 
[UIView animateWithDuration:0.8 animations:^{
 这里写动画的内容
  self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, M_PI_4);
  
  
 } completion:^(BOOL finished) {
   self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, 0, 50);
 }];

 

 UILabel

 
 
1.创建及其确定位置大小
UILabel *label=[UILabel  alloc]initWithFram.CGRectMake:(  10,20, 30, 40);
2.设置标签
label.test=@“ 内容   ”;
3.行数设置,如果设置为大于0的值,那么代表最多可显示行。 0 表示没有行数限制,只要范围足够,自动换行
                label.numberOfLines = 0;
4. 设置文本的字体,美工给的字号如果你觉得太大了,可以认为他给的是px单位,我们直接把字号除以2。
        a. 常规
                label.font = [UIFont systemFontOfSize:字体大小]; 
       b.加粗
                  label.font = [UIFont boldSystemFontOfSize:字体大小]; 
 
5.根据label宽度调整字体
            label.adjustsFontSizeToFitWidth = YES;
6.根据字体去适配合适的label尺寸(要先设置内容,其次设置行数没有限制。字体也要先设置好)
                    【label   sizeToFit】;
7.对齐方式
     NSTextAlignmentLeft 左对齐
     NSTextAlignmentCenter 居中
     NSTextAlignmentRight 右对齐
 
    textLabel.textAlignment = NSTextAlignmentCenter;
 
8.label宽度不够时,对文本进行打断的方式
 
label.lineBreakMode = NSLineBreakByTruncatingHead;
 
9.设置文本的阴影
 
label.shadowColor = 【UIColor   grayColor】;  阴影部分的颜色
label.shadowOffset = CGSizeMake(5,5);    阴影部分的大小
 
10.当文本变为高亮状态以后,显示的颜色-------高亮状态(设置了并没有立即变换状态)
 
label.highlightedTextColor = 【UIColor  greenColor】;
 
[self performSelector:@selector(changeLabelColor:) withObject:textLabel afterDelay:5];     延迟方法的调用
 
【self.view    addSubview:label】;   将label添加到视图中
- (void)changeLabelColor:(UILabel *)label {
 label.highlighted = !label.highlighted;
}
 
UIImageView
            
1.添加显示图片,如果是png格式 ,则不需要添加后缀。
            UIImage * image = [UIImage imageNamed:@"图片名称"];
2.设置图片视图的内容模式
UIViewContentModeScaleToFill                 拉伸铺满视图,不在乎图像比例
UIViewContentModeScaleAspectFit           自适应拉伸,不破坏宽高比,如果宽/高沾满视图,另外一边不再进行缩放
 UIViewContentModeScaleAspectFill          不破坏宽高比,可以超出视图范围
3.裁剪圆,设置半径
//imageView.contentMode = UIViewContentModeCenter;
imageView.layer.cornerRadius = 半径;
4.与内容裁剪配置
      imageView.clipsToBounds = YES;
5.设置tag值                imageView.tag = 1001;
 
UIButton
 
1.UIButton * btn = [UIButton buttonWithType:UIButtonTypeSystem];
 btn.frame = CGRectMake(10, 10, 44, 44);
 btn.backgroundColor = [UIColor redColor];
2.相当于IB上的方法连线
 /* 给按钮添加方法
  *
  * id ---- 谁调用方法
  * SEL ---- 调用的方法
  * UIControlEvent ----- 触发时机
[btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
 
3.按钮添加文字
 [btn setTitle:@"切换" forState:UIControlStateNormal];
4. 作为子视图添加-----按钮是默认不能使用
// [self.view addSubview:btn];
 [imageView addSubview:btn];
5.如果一个按钮作为一个ImageView的子视图,默认是无法点击的
  UIImageView默认是不相应用户交互
  设置交互后,会影响子视图(如果imageView可以交互,他所有的子视图,也可以相应交互)                imageView.userInteractionEnabled = YES;
6.手动创建按钮
// UIButton * btn = [UIButton buttonWithType:UIButtonTypeSystem];
 // 使用alloc方法创建的按钮默认状态为custom
 UIButton * btn = [[UIButton alloc] init];
 btn.frame = CGRectMake(200, 200, 200, 200);
 btn.backgroundColor = [UIColor darkGrayColor];
7.绑定目标动作
 [btn addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];
8.设置按钮的标题
 [btn setTitle:@"普通状态" forState:UIControlStateNormal];
UIControlStateHighlighted    高亮状态
UIControlStateSelected        选中状态
UIControlStateDisabled       禁用状态,当enable == NO的时候,按钮成为disabled状态
9.设置按钮的图片
 
  * setImage:forState:使用的是图片的原始大小。让按钮显示的更加精致,如果frame够大,点击也方便
  *setBackgroundImage:forState:把图片设置为按钮幕后的背景,会拉伸图片
UIImage * image = [UIImage imageNamed:@"playing_btn_love@2x"];
[btn setImage:image forState:UIControlStateNormal];
10.设置标题的颜色,自定义设置下,默认颜色为白色,系统状态下,默认颜色为蓝色
// [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
 
11.选中状态改变
 sender.selected = !sender.selected;
12. 按钮是否可以使用 继承与UIControl的属性,可以改变界面效果
// sender.enabled = !sender.enabled/NO;
13.是否可以与用户交互,来自于UIView。 不影响外观
// sender.userInteractionEnabled = NO;
 
 
 
 
 
 
  UIControl
 
 
1.UIControl  他是UIView的子类, 可以会用他的子类来做具体的控制, 子类可以使UIkit框架类的,我们也可以自定义控件对象
 
2.为控件绑定一个目标,动作,触发时机
  * 可以是一个控件 绑定多个目标动作
  * 可以有多个控件 绑定一个目标动作
  *
  * @param id 可以是任意目标相应
  * @param action 一个消息
  * @parm Event 事件
 
 [control addTarget:self action:@selector(controlAction:) forControlEvents:UIControlEventTouchUpInside];
 
3. 触摸取消(触摸还在发生,屏幕失去焦点:锁屏,电话呼入)
        UIControlEventTouchCancel
 
4.开始追踪
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event {
 
 UITouch 触摸对象。指代触摸。(简单的理解为触摸在屏幕上的手指)
 
 获取触摸所在视图上的点
 CGPoint touchPoint = [touch locationInView:self.superview];
 NSLog(@"%@", NSStringFromCGPoint(touchPoint));
 
 
 TouchEvent-----UIControlTouchUpDown
 TouchDown
 NSLog(@"开始追踪触摸");
 return YES;
}
 
5.继续追踪
- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event {
 获取触摸所在视图上的点
 CGPoint touchPoint = [touch locationInView:self];
 NSLog(@"%@", NSStringFromCGPoint(touchPoint));
 
 if (touchPoint.x > self.bounds.size.width || touchPoint.y > self.bounds.size.height) {
  NSLog(@"触摸点在外部");
 }
 //TouchDrag
 
// NSLog(@"继续追踪触摸");
 
 return YES;
}
 
6.结束追踪
- (void)endTrackingWithTouch:(nullable UITouch *)touch withEvent:(nullable UIEvent *)event {
 // 获取触摸所在视图上的点
 CGPoint touchPoint = [touch locationInView:self];
 NSLog(@"%@", NSStringFromCGPoint(touchPoint));
 // 判断一个触摸点是否在矩形区域内
 if (touchPoint.x > self.bounds.size.width || touchPoint.y > self.bounds.size.height) {
  NSLog(@"UIControlEventTouchUpOutside");
  
  // 可以在恰当的时机发送valueChange
  [self sendActionsForControlEvents:UIControlEventTouchUpOutside];
 }
 // TouchUp
 NSLog(@"结束追踪触摸");
}
7.取消追踪
- (void)cancelTrackingWithEvent:(nullable UIEvent *)event {
 // TouchCancel
 NSLog(@"失去焦点");
}
 
 
  UITextField
 
1.外框风格
 textField.borderStyle = UITextBorderStyleRoundedRect;
2.设置或者获取输入框内容
// textField.text = @"hello";
3.设置字体大小及其居中
 textField.font = [UIFont systemFontOfSize:28];
 textField.textAlignment = NSTextAlignmentCenter;
4.输入提示
 textField.placeholder = @"请输入手机号";
5.是否支持清除按钮
 /*
  * UITextFieldViewModeNever, ------ 永远不出现
  * UITextFieldViewModeWhileEditing, ------当编辑的时候出现
  * UITextFieldViewModeUnlessEditing -----当结束编辑时出现
  * UITextFieldViewModeAlways ----- 一直出现
  */
 textField.clearButtonMode = UITextFieldViewModeUnlessEditing;
 6.编辑之前清除
textField.clearsOnBeginEditing = YES;
7.安全输入
// textField.secureTextEntry = YES;
8.设置右下角return 类型
 textField.returnKeyType = UIReturnKeyDone;
9.是否可用
// textField.enabled = NO;
10.给输入框添加动作
 [textField addTarget:self action:@selector(textEditing:) forControlEvents:UIControlEventEditingDidBegin];
11.设置输入框的代理
 textField.delegate = self;
12.代理方法
- (void)textEditing:(UITextField *)tf {
 NSLog(@"开始编辑");
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
 
 NSLog(@"将要开始编辑");
 return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField {
 
 NSLog(@"已经开始编辑");
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
 
 NSLog(@"将要结束编辑");
 return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
 
 NSLog(@"已经结束编辑");
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
 
 // 新内容所在的位置---长度为0
 NSLog(@"range :%@", NSStringFromRange(range));
 
 // 新输入的内容
 NSLog(@"string :%@", string);
 
 
 if (range.location <= 10) {
  return YES;
 }
 // 如果返回NO的话,字符内容不发生变化。依然会接受
 return NO;
}
- (BOOL)textFieldShouldClear:(UITextField *)textField {
 return YES;
}
 
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
 
 // 模拟应用效果
 // 用户点击返回按钮,收起键盘/发送消息
 [textField resignFirstResponder];
 NSLog(@"%@", textField.text);
 return YES;
}
- (void)didReceiveMemoryWarning {
 [super didReceiveMemoryWarning];
 
}
 
UIAlertView
 
1.UIAlertView的创建
   *
   * @param Title 标题
   * @param Message 文本提示信息
   * @param delegate 代理----
   * @param cancelTitle 取消按钮标题
   * @param otherTitle 其他按钮标题
 
 UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"小明要上课" message:@"小明上课迟到了" delegate:self cancelButtonTitle:@"什么事都没有" otherButtonTitles:@"罚站", nil];
 
2. UIAlertViewStyleDefault
// UIAlertViewStyleSecureTextInput,
// UIAlertViewStylePlainTextInput,
// UIAlertViewStyleLoginAndPasswordInput
 
alertView.alertViewStyle = UIAlertViewStylePlainTextInput;
 
 [alertView show];
3.* UIAlertController的初始化
  *
  * @param Title 标题内容
  * @param Message 提示文本信息
  * @param UIAlertControllerStyle 弹窗显示样式
  */
 UIAlertController * alertView = [UIAlertController alertControllerWithTitle:@"定位信息" message:@"您没有开启GPS定位,请前往设置开启" preferredStyle:UIAlertControllerStyleAlert];
 
 // handle --- 处理
 // 弹窗按钮
 UIAlertAction * alertAction1 = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  NSLog(@"确定按钮点击");
 }];
 
 UIAlertAction * alertAction2 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
  NSLog(@"取消按钮点击");
 }];
 
 
 UIAlertAction * alertAction3 = [UIAlertAction actionWithTitle:@"用户不知道点什么" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
  NSLog(@"瞎点了一个按钮");
 }];
 
 
 // 弹窗按钮要起作用一定要添加到alertController
 [alertView addAction:alertAction1];
 [alertView addAction:alertAction2];
 // [alertView addAction:alertAction3];
 
 [self presentViewController:alertView animated:YES completion:nil];
 
UISlider
 
 
1. 添加事件----一定要手动滑动滑块
 [slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
 
 
 2. 设置最小值和最大值(歌曲 总时长:3:20 = 3 * 60 + 20)
 slider.minimumValue = 0;
 slider.maximumValue = 200; // 假设总时长是200
 
 [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(playAction:) userInfo:slider repeats:YES];
 
 
3.自定义滑块
 // 左右轨迹,大头针
 slider.minimumTrackTintColor = [UIColor cyanColor];
 slider.maximumTrackTintColor = [UIColor blackColor];
 
 // 设置轨迹图片
// [slider setMinimumTrackImage:<#(nullable UIImage *)#> forState:UIControlStateNormal];
// [slider setMaximumTrackImage:<#(nullable UIImage *)#> forState:<#(UIControlState)#>]
 
 slider.thumbTintColor = [UIColor redColor];
 // 设置大头针图片
 [slider setThumbImage:[UIImage imageNamed:@"Star-Gold"] forState:UIControlStateNormal];
 
 
 
   模态页面
 
1.调用方法模态呈现界面
  * @param UIViewControll 将要呈现的视图控制器页面
  * @param animated 弹出效果是否有动画
  * @param completion 完成之后的回调
  */
// presentViewController:<#(nonnull UIViewController *)#> animated:<#(BOOL)#> completion:<#^(void)completion#>
 
2.弹出方式
UIModalTransitionStyleCoverVertical 垂直弹出
 UIModalTransitionStyleFlipHorizontal 水平翻转
 UIModalTransitionStyleCrossDissolve 渐入渐出
 UIModalTransitionStylePartialCurl 竖直翻页
 
3.模态页面的消失
         [self dismissViewControllerAnimated:YES completion:nil];
 
 
 
 
    导航控制器的创建
 
1.设置不同视图控制器页面的导航栏标题,一定要有导航控制器来管理
 self.title = @"设置";
 
2.push使用导航控制器 弹出下一级页面
 [self.navigationController pushViewController:vc animated:YES];
 
3.返回导航控制器上一级页面
 [self.navigationController popViewControllerAnimated:YES];
 
 
 
 
 
 
   UINavigationBar
 
1.  每一个导航控制器有一个导航栏
 
  导航控制器可以管理N个子控制器
 
  每一个自控制器都有一个相对于的导航项(UINavigationItem)
 
 每一页面导航栏的内容, 由导航项决定
 
自定义导航栏----iOS6.0,iOS7.0高度不同
 
 7.0之后高度是64. 20 + 44
 
 7.0之前导航栏是不透明的,iOS7.0之后导航栏是半透明
 
2. 自定义视图
 UIButton * leftButton = [UIButton buttonWithType:UIButtonTypeCustom];
 leftButton.frame = CGRectMake(0, 0, 44, 44);
 [leftButton setBackgroundImage:[UIImage imageNamed:@"134859qtpkqk5tgcwnzpzt.jpg"] forState:UIControlStateNormal];
 创建出来的button需要转化成导航栏适用UIBarButtonItem
 UIBarButtonItem * leftItem1 = [[UIBarButtonItem alloc] initWithCustomView:leftButton];
 设置导航栏左侧按钮
self.navigationItem.leftBarButtonItem = leftItem;
self.navigationItem.leftBarButtonItem = leftItem1;
 self.navigationItem.leftBarButtonItems = @[leftItem, leftItem1];

3.设置导航栏右侧按钮
 实际上不是视图,是导航栏上的一块内容,可以绑定不同的视图和动作
 self.navigationItem.rightBarButtonItem
 
4.获取导航栏
 UINavigationBar * bar = self.navigationController.navigationBar;
 使用backgroundColor设置没有效果
 
5.设置导航栏的背景颜色
                             bar.barTintColor = [UIColor magentaColor];
 
6.  tintColor设置导航栏上子控件的默认内容颜色
                             bar.tintColor = [UIColor whiteColor];
 
7. // 设置导航栏样式,默认时:状态栏会是黑色
 // black时:状态栏是白色
                             bar.barStyle = UIBarStyleBlack;
 
 
8. 导航栏7.0之后默认是半透明,我们可以通过设置导航栏是否透明,改变controller.view的起点
                                bar.translucent = NO;
 
 
  标签栏
1.自定义标签栏之前,首先要将系统自带的按钮删除,然后在自己创建
    for (UIView * subView in self.tabBar.subviews) {
      [subView removeFromSuperview];
     }
2.设置背景图片,tabBar自带的 属性,可以帮我们设置大小和和位置还有父视图
     self.tabBar.backgroundImage = [UIImage imageNamed:@"navbg"];
3.自定义多个按钮需要利用for循环来循环创建
 
 
 
 
 滑动视图
 
1.创建滑动视图
     UIScrollView * scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,     0,         414, 300)];
 2.设置内容尺寸,只设置滑动方向
     scrollView.contentSize = CGSizeMake(3 * 414, 0);
3.利用for循环来创建,如果视图的位置超出了scrollView.contentSize范围,视图依旧加载,但是用户不能滑到相应位置,上面需要添加显示的内容
 
4.设置分页效果     scrollView.pagingEnabled = YES;
 
5.设置水平和垂直滚动条
     scrollView.showsHorizontalScrollIndicator = NO;
     scrollView.showsVerticalScrollIndicator = NO;
6.获取滑动视图内容的偏移量,用 Point 表示位置,实际是内容偏移的X Y轴
         scrollView.contentOffset
7.签订代理   scrollView.delegate = self;
 
8.已经滑动方法
 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
 
 CGPoint point = scrollView.contentOffset;
获取偏移量
 NSLog(@"当前偏移量 :%@", NSStringFromCGPoint(point));
}
 
   页码控件 
 
1.页码控件的创建
self.pageCtrl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, kScreenHeight - 20.0, kScreenWidth, 20.0)];
 2.页码数  
    self.pageCtrl.numberOfPages = 5;
3.当前选中页面
     self.pageCtrl.currentPage = 0;
4.未选中点颜色
 ·    self.pageCtrl.pageIndicatorTintColor = [UIColor blueColor];
5.当前点的颜色
     self.pageCtrl.currentPageIndicatorTintColor = [UIColor redColor];
6.将要结束滑动
 
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0) {
 
 // 目标偏移量
 CGPoint point = *targetContentOffset;
 
 // 当前页面数 = 当前偏移量 / 屏幕宽度
 NSInteger pageNum = point.x / kScreenWidth;
 
 // 将页码控件的当前页面值设为计算后的值
 self.pageCtrl.currentPage = pageNum;
}
 
7.滑动视图已经停止减速
//- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
// NSLog(@"滑动停止,处于静止状态");
// 
// // 当前偏移量
// CGPoint point = scrollView.contentOffset;
//
// // 当前页面数 = 当前偏移量 / 屏幕宽度
// NSInteger pageNum = point.x / kScreenWidth;
//
// // 将页码控件的当前页面值设为计算后的值
// self.pageCtrl.currentPage = pageNum;
}
8.如果需要无线滑动,需要在左右两边各多方一张图片,然后通过改变偏移量来改变滑动位置,内容一般写在已经滑动或者减速结束之后里面
 
  内边距问题
 
1.系统自动帮我调整了scrollView中视图内容的位置,不设置的话,视图会乡下移动64个像素。将导航栏设置为不透明效果,可以解决自动向下偏移内边距的问题
      self.automaticallyAdjustsScrollViewInsets = NO;
2.控制器四周延伸布局
     self.edgesForExtendedLayout = UIRectEdgeNone;
3.内边距偏移量不对的问题,只会出现在UIScrollView及其子类上
 问题原因:导航栏占据了64个像素,导航栏是半透明效果,并且融入了状态栏
 
 
图片的缩放
 
1.首先签订协议,然后创建手势
    UITapGestureRecognizer * tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureAction:)];
 
2.设置点击次数
     tapGes.numberOfTapsRequired = 2;
3. 添加相对应的手势操作,设置手势的依赖视图
     [self.scrollView addGestureRecognizer:tapGes];
 
4.手势的方法
- (void)tapGestureAction:(UITapGestureRecognizer *)tap {
 
 // 设置缩放倍数
// self.scrollView.zoomScale = 2.0;
 
 if (self.scrollView.zoomScale > 1.0) {
// self.scrollView.zoomScale = 1.0;
  [self.scrollView setZoomScale:1.0 animated:YES];
 } else if (self.scrollView.zoomScale < 1.0) {
// self.scrollView.zoomScale = 1.0;
  [self.scrollView setZoomScale:1.0 animated:YES];
 } else {
// self.scrollView.zoomScale = 2.0;
  [self.scrollView setZoomScale:2.0 animated:YES];
 }
 
5.指定将要缩放的视图是对应的imageView
    - (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
 
 return [self.view viewWithTag:101];
}
 
 
 
  UITableView
 
1.创建UITableView的时候使用initWithFrame:style:
 // 风格是必须要设置
 // 默认状态创建出来的tableView
 // 使用plain是可以显示很多格子(假格子)
 // 如果使用group风格,那么视图的背景颜色会发生变化,并且默认没有格子显示
UITableView * tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
 
2.想要对单元格进行操作,需要设置数据源协议
     tableView.dataSource = self;
3.单元格事件都和代理相关
 tableView.delegate = self;
 
4.指定组数,在group情况下,你有几组TableView,默认情况下,组数为1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
 
 return 1;
}
 
5.指定每一组单元格的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 
 return 10;
}
 
6.实现每一行的单元格
// 返回单元格,返回NSIndexPath所指向位置的单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 
// UITableViewCell * cell = [[UITableViewCell alloc] init];
 
 // 简单的实现,暂时不考虑复用问题
 UITableViewCell * cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
 
 cell.backgroundColor = [UIColor colorWithRed:arc4random_uniform(255) / 255.0 green:arc4random_uniform(255) / 255.0 blue:arc4random_uniform(255) / 255.0 alpha:1];
 
 // indexpath:每一次都会指定单元格的位置,返回单元格的方法会回调多次,使indexPath位置不同
  // indexPath.section // 组索引
  // indexPath.row // 行索引
 // 设置第3行和第10行的单元格颜色为黑
 if (indexPath.row == 2 || indexPath.row == 9) {
// cell.backgroundColor = [UIColor blackColor];
 }
 
 // 自带的textLabel就可以显示文字
 cell.textLabel.text = [NSString stringWithFormat:@"这是第%ld行", indexPath.row];
 // 自带的图片,效果会顶满整个cell
 cell.imageView.image = [UIImage imageNamed:@"134859qtpkqk5tgcwnzpzt.jpg"];
 
 return cell;
 
}
 
7.点击单元格触发代理方法,根据indexPath参数可以判断点击的单元格是哪一个
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 
 if (indexPath.row == 2) {
  NSLog(@"第3行被点了");
 } else {
 
  NSLog(@"我被点了");
 }
}
 
8.设置表视图顺序的索引,显示索引名称,比如联系人后面的字母
- (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView {
 
 return self.provincesArray;
}
 
9.UITableView的组头和组尾标题
// 这里的字符串是表视图加载的时候回全部加载,注意:数组越界
- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
 return self.provincesArray[section];
}
- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
return section;
}
 
10.如果使用新的复用方法,在tableView创建的时候就要注册单元格
 
  @param Class 将要复用的单元格类,这个类只能是UITableViewCell及其子类
   @param Identifier 复用标示
11.只要需求单元格,就会调用这个方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 
 // 重复创建单元格的话,如果有100个单元格,那么需要创建100次
// [[UITableViewCell alloc] initWithStyle: reuseIdentifier:nil]
 
 // 使用可复用的单元格,让表视图去复用池中查询 是否有可用的单元格,如果复用池中有可复用的单元格,就直接返回。如果没有,则自己创建新的单元格
// UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell-01"];
// NSLog(@"row %ld .tag : %ld",indexPath.row, cell.tag);
// 
// 
// if (!cell) {
// cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell-01"];
// }
 
 
 // iOS新的复用单元格方法
 UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell-01" forIndexPath:indexPath];
 
 cell.tag = indexPath.row + 1;
 cell.textLabel.text = [NSString stringWithFormat:@"%ld", indexPath.row];
 
 return cell;
}
 
12.对于组头视图而言,一定要给TableView的组头规定高度
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
 // *******没有使用复用头视图进行创建********
 
// if (section == 0) {
// // 在组头视图中,返回的视图不需要设置大小
// UIView * view = [[UIView alloc] init];
// view.backgroundColor = [UIColor redColor];
//  
// UIScrollView * scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 150)];
// scrollView.contentSize = CGSizeMake(5 * [UIScreen mainScreen].bounds.size.width, 0);
// [view addSubview:scrollView];
//  
//  
// for (int i = 0; i < 5; i++) {
// UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(i * [UIScreen mainScreen].bounds.size.width, 0, [UIScreen mainScreen].bounds.size.width, 150)];
// imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d", i]];
// [scrollView addSubview:imageView];
// }
//  
//  
//  
// return view;
// } else if (section == 1) {
// return nil;
// } else {
// return nil;
// }
 
13.可以根据section参数,对不同的组头高度进行设置
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
   if (section == 0) {
      return 150;
   } else if (section == 1) {
      return 300;
   } else {
      return 0;
   }
}
 
  UITableView和Cell的常用属性
 
 
1.当直接使用UITableViewController时,系统会自动帮我们添加数据源协议和代理协议,并且设置代理对象为self。同时,系统默认帮我添加了一些方法
 
2.对tableView进行的设置是相对全局设置,所有的都会遵循  行高
  self.tableView.rowHeight = 100;
 
3.设置背景图片
 
UIImageView * imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"100.jpg"]];
 self.tableView.backgroundView = imageView;
 
使用颜色将图片进行展示
// self.tableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"100.jpg"]];
 
 
4.分割线的颜色
 
 self.tableView.separatorColor = [UIColor redColor];
 
5.None:没有分割线 singleLine:单行 singleLineEtched:虚线                       self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
 
6.分割线只能够左右调整
 self.tableView.separatorInset = UIEdgeInsetsMake(1, 3, 50, 10);
 
7.表视图的头视图
 // 表头和组头不一样,必须要设置frame大小
 UIView * view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 150)];
 view1.backgroundColor = [UIColor purpleColor];
 self.tableView.tableHeaderView = view1;
 
8.cell背景图    cell.backgroundView = imageView;
 
 
9.选中风格
cell.selectionStyle = UITableViewCellSelectionStyleNone;
 
10.cell选中背景图  如果设置了选中样式为none,那么选中图片也不会有显示
 UIImageView * imageViewSelected = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tableCell_common_tapped"]];
 cell.selectedBackgroundView = imageViewSelected;
 
11.单元格的辅助视图
 
   UITableViewCellAccessoryNone,
      UITableViewCellAccessoryDisclosureIndicator--向右箭头
   UITableViewCellAccessoryDetailDisclosureButton--详情按钮
   UITableViewCellAccessoryCheckmark,--对勾
 
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton
 
12.选中单元格
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 
}
 
 
13.辅助视图button 方法
 
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
 
 NSLog(@"第%ld行的按钮", indexPath.row);
 
 // 获取对应的cell
 UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
 // 更改单元格上的辅助视图
// cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
 
}
14.想要针对不同的单元格设置不同的单元格高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
 
 if (indexPath.row == 0) {
  return 10;
 } else if (indexPath.row == 3){
  return 150;
 } else {
  return 100;
 }
 
}
 
编辑模式
 
 
1.是否允许用户在编辑模式下进行选中单元格操作
 self.tableView.allowsSelectionDuringEditing = YES;
 
2.多选
self.tableView.allowsMultipleSelectionDuringEditing = YES;
 
3.是否开启编辑模式
 [self.tableView setEditing:sender.selected animated:YES];
 
 
4.改变编辑风格
 
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
 
 return UITableViewCellEditingStyleDelete;
}
 
5.单元格数目变化,在这个方法里面完成
// 自带向左轻扫手势,会弹出删除,向左滑动会弹出删除
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
 
 if (editingStyle == UITableViewCellEditingStyleDelete) {
  // 开始tableView内容的更新,需要和结束方法成套的使用,有开始更新就一定要有结束更新(否则不会产生效果),在方法之间的更新,一定要更新数据源
  [tableView beginUpdates];
  
  // 1.改变数据源
  [self.mutableArr removeObjectAtIndex:indexPath.row];
  
  // 2.改变界面元素---》对表视图中的数据进行刷新
  [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
  
 
  
  [tableView endUpdates];
 } else if (editingStyle == UITableViewCellEditingStyleInsert) {
 
  
 }
}
 
6.复写此方法,可以直接移动单元格,对单元格重新排序
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {
 
}
 
 
UICollectionView
 
1创建UICollectionView
  layout:布局.
        UICollectionView * collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];
2.UICollectionViewLayout这个类只是一个基类,只提供方法和属性,但是不提供布局信息
 UICollectionView Layout * layout = [[UICollectionViewLayout alloc] init];
 // 流水布局 一般采用流水布局
UICollectionViewFlowLayout * layout = [[UICollectionViewFlowLayout alloc] init];
3.设置单元格大小
layout.itemSize = CGSizeMake(44, [UIScreen mainScreen].bounds.size.height);
4.每行的间距
// layout.minimumLineSpacing = 1;
 // 每个单元格之间的间距
// layout.minimumInteritemSpacing = 1;
5.设置滑动方向
 layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
6.集合视图 跟表视图一样都要注册 
[collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:cellID];
7.collectionView同样需要数据源方法来提供单元格
 collectionView.dataSource = self;
 collectionView.delegate = self;
8.组数的设置
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
 return 20;
}
9.- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
 
 // 在collectionView中,对复用更加的强调,我们一定要使用复用单元格的方法来进行复用,并且是使用新方法来进行复用,我们一定要进行单元格的注册
// UICollectionViewCell * cell = [[UICollectionViewCell alloc] init];
 UICollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
 
 
 cell.backgroundColor = [UIColor greenColor];
 
 return cell;
}
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/houjiie/p/6183037.html