• 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;
    }
     
     
     
     
     
     
     
  • 相关阅读:
    蓝桥杯训练 | 二分和前缀和 | 02
    广西师大数据结构 | 2015年真题 | 02
    广西师大数据结构 | 2014年真题 | 01
    Centos添加开机自启项
    SUSE系统添加开机自启项
    LNMP
    源码编译安装 libiconv-1.14(php依赖)
    lnmp
    centos添加epel源
    系统挂在镜像
  • 原文地址:https://www.cnblogs.com/houjiie/p/6183037.html
Copyright © 2020-2023  润新知