OC学习之——UI(一)

目录

一、UILabel标签控件

二、UIButton按钮控件

2.1 UIButton事件:

三、UIView基础

3.1 隐藏视图对象:

3.2 UIView的层级关系

四、UIWindow对象

五、UIViewController基础

5.1 视图控制器的界面切换

5.2 定时器与视图移动

5.2.1 用定时器实现视图移动:

六、UITextField控件

6.1 UITextFieldDelegate协议

 七、UIScrollView滚动视图

7.1 滚动视图的高级属性

 八、步进器和分栏控件

 九、UISwitch

十、进度条和滑动条


一、UILabel标签控件

        UILabel是可以显示在屏幕上,并且可以显示文字的一种UI视图。

我们用代码来演示UILabel的相关方法:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

//创建UI控件函数
- (void) creatUI {
    UILabel *label = [[UILabel alloc] init];
    
    //显示文字的赋值
    label.text = @"喜多川海梦你带我肘吧喜多川海梦没有你我怎么活啊————";
    
    //设定label的显示位置
    label.frame = CGRectMake(10, 400, 410, 200);
    
    //设定label的背景颜色
    label.backgroundColor = [UIColor yellowColor];
    
    //设定整个屏幕的背景颜色
    self.view.backgroundColor = [UIColor redColor];
    
    //将label显示到屏幕上
    [self.view addSubview: label];
    
    //设置label的文字的大小和字体,此处使用的是系统默认字体,大小是34
    label.font = [UIFont systemFontOfSize: 34];

    //设置label的文字的颜色
    label.textColor = [UIColor blueColor];
    
    //label的高级属性----------------

    //设定label的文字的阴影颜色
    label.shadowColor = [UIColor greenColor];
    //设置阴影的偏移位置
    label.shadowOffset = CGSizeMake(10, 10);
    
    //设置text文字的对齐方式,默认为靠左对齐,当前设置的是居中对齐
    label.textAlignment = NSTextAlignmentCenter;
    
    //显示label中文字显示的行数,默认值为1,其他的>0的行数,文字会尽量按照设定的行数显示
    //如果值为0,iOS会自动计算所需要的行数,按需要的行数显示文字
    label.numberOfLines = 3;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self creatUI];//调用创建UI函数
}


@end

        演示结果:

  

        要注意的是:

        frame的类型是CGRect类型,这个类型是一个结构体,它里面有origin和size两个成员变量,而origin和size又是两个结构体,其中origin的类型是CGPoint结构体,它里面包含一个x和一个y作为坐标,因此说明origin代表的是一个点;size的类型是CGSzie结构体,它里面包含一个宽度和一个高度,因此说明size代表的是显示出来的矩形的宽高。origin控制了label所在矩形的左上角位置,size控制了矩形大小。控制位置的方法要传入四个数字参数,第一个数字是到屏幕左边框的距离,第二个数字是到屏幕上边框的距离,第三个数字是矩形的宽,第四个数字是矩形的长。        

        控制背景颜色的方法中,要调用UIColor的颜色方法,如红色:[UIColor redColor],传入clearColor可以使背景颜色透明。

        设置整个屏幕的背景颜色可以通过调用self.view.backgroundColor。

二、UIButton按钮控件

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

static int num = 0;

//创建普通按钮函数
- (void) creatUIRectButton {
    //创建圆角按钮
    UIButton *btn = [UIButton buttonWithType: UIButtonTypeRoundedRect];
    UIButton *btn2 = [UIButton buttonWithType: UIButtonTypeRoundedRect];
    
    //设置button按钮的位置
    btn.frame = CGRectMake(100, 100, 150, 80);
    btn2.frame = CGRectMake(100, 200, 150, 50);
    
    //为按钮上设置文字内容
    //在第一个为按钮设置文字的代码中,传入的两个参数,第一个是字符串表示文字内容,第二个表示按钮状态
    //UIControlStateNormal代表按钮的正常状态
    [btn setTitle: @"按钮1" forState: UIControlStateNormal];
    [btn2 setTitle: @"按钮2" forState: UIControlStateNormal];
    //第二个为按钮设置文字的代码表示按钮按下之后的状态
    [btn setTitle: @"按钮1已按下" forState: UIControlStateHighlighted];
    [btn2 setTitle: @"按钮2已按下" forState: UIControlStateHighlighted];

    //为按钮设置背景颜色
    btn.backgroundColor = [UIColor yellowColor];
    btn2.backgroundColor = [UIColor greenColor];
    
    //为按钮的文字内容设置颜色的方法:
    [btn setTintColor: [UIColor redColor]];//titleColor存在的时候,它的优先级低于title,就无法显示它的颜色
    [btn setTitleColor: [UIColor blueColor] forState: UIControlStateNormal];
    [btn setTitleColor: [UIColor greenColor] forState: UIControlStateHighlighted];
    [btn2 setTitleColor: [UIColor redColor] forState: UIControlStateNormal];
    [btn2 setTitleColor: [UIColor blackColor] forState: UIControlStateHighlighted];
    
    //设置按钮文字的样式和大小,这里是系统默认样式,大小为24
    btn.titleLabel.font = [UIFont systemFontOfSize: 24];
    btn2.titleLabel.font = [UIFont systemFontOfSize: 24];
    
    //添加Button事件
    [btn addTarget: self action: @selector(press02:) forControlEvents: UIControlEventTouchUpInside];
    [btn2 addTarget: self action: @selector(press02:) forControlEvents: UIControlEventTouchUpInside];
    
    //为两个按钮的tag属性赋值,便于作为参数传入函数后判断
    btn.tag = 123;
    btn2.tag = 456;
    
    //添加到视图中并显示
    [self.view addSubview: btn];
    [self.view addSubview: btn2];
}

//创建一个可以创建图片的按钮
- (void) createImageButton {
    //创建一个自定义类型的button,注意是自定义类型,所以必须要是custom的
    UIButton *btnImage = [UIButton buttonWithType: UIButtonTypeCustom];
    
    //确定图片的位置
    btnImage.frame = CGRectMake(80, 250, 300, 300);
    
    //做两张图片的加载,btn01,btn02是图片名,要记得加上图片类型(jpg.这种)
    UIImage *icon01 = [UIImage imageNamed: @"btn01.jpg"];
    UIImage *icon02 = [UIImage imageNamed: @"btn02.jpg"];
    
    //为两张图片按钮的状态设置不同的图片
    //传入的第一个参数是显示的图片对象,第二个参数是控件的状态
    //此处正常状态是图片btn01,按下状态是btn02
    [btnImage setImage: icon01 forState: UIControlStateNormal];
    [btnImage setImage: icon02 forState: UIControlStateHighlighted];
    
    //添加到视图中显示
    [self.view addSubview: btnImage];
}

//Button事件:-----------------------------
- (void) creatBtn {
    //创建一个圆角按钮
    UIButton *btn2 = [UIButton buttonWithType: UIButtonTypeRoundedRect];
    
    btn2.frame = CGRectMake(100, 600, 300, 100);
    
    [btn2 setTitle: @"❤️喜多川海梦❤️" forState: UIControlStateNormal];
    
    btn2.backgroundColor = [UIColor systemPinkColor];
    [btn2 setTitleShadowColor: [UIColor redColor] forState: UIControlStateNormal];
    [btn2 setTitleShadowOffset: CGSizeMake(4, 4)];
    [btn2 setTitleColor: [UIColor orangeColor] forState: UIControlStateNormal];
    [btn2 setTitleColor: [UIColor whiteColor] forState: UIControlStateHighlighted];
    btn2.titleLabel.font = [UIFont systemFontOfSize: 36];
    
    //向按钮添加事件:传入了三个参数:
    //第一个参数
    //第二个参数传入一个函数对象,当按钮满足第三个参数的条件的时候,调用函数
    //第三个参数是事件处理函数,此处的UIControlEventTouchUpInside是指当手指离开屏幕时并且手指的离开位置在屏幕范围内触发事件函数,一般这种按钮对于用户是按上了有反悔的机会
    //还有一个方法是叫UIControlEventTouchDown,它是只要手指触碰到了按钮就直接触发函数
    //还有一个方法是叫UIControlEventTouchOutside,和indide相反,它是只有手指按下并移动到按钮外才会触发
    [btn2 addTarget: self action: @selector(pressBtn) forControlEvents: UIControlEventTouchUpInside];
    
    [self.view addSubview: btn2];
}

//通过传入的参数对两个按钮的结果做区分
- (void) press02: (UIButton*) btn {
    if (btn.tag == 123) {
        NSLog(@"按下了按钮1");
    }
    if (btn.tag == 456) {
        NSLog(@"按下了按钮2");
    }
}

- (void) pressBtn {
    if (num < 10) {
        NSLog(@"你摸了摸海梦的头~");
        num++;
    } else {
        NSLog(@"海梦不想被摸摸头了喔~");
    }
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self creatUIRectButton];
    [self createImageButton];
    [self creatBtn];
}


@end

运行结果:

点击按钮的结果:

1. 调用UIButtonTypeRoundedRect,即可得到圆角按钮

2. 通过类方法来创建buttonWithType:类名+方法名

3. 所有的button的创建方法都应该用类方法,button是不能使用alloc init来动态分配内存的,因为button的内存是自己管理的

4. 设置按钮文字颜色可以用tintColor也可以用titleColor,其中titleColor的优先级高于tintColor,且tintColor无法设置状态

5.  titleLabel是属于UILabel属性的

2.1 UIButton事件:

1. 创建UIButton事件要用addTarget方法,用这个方法后面要跟三个参数:

        第一个参数表示的是实现函数的对象

        第二个参数表示的是传入的一个函数对象,当按钮满足第三个参数的条件时,就会调用传入的函数,当这个函数没有参数的时候,就可以直接调用;当它有参数的时候,传入的参数是按钮

        第三个参数表示的是事件处理函数类型,它有以下几种方法:

2. UIControlEventTouchUpInside是指当手指离开屏幕时并且手指的离开位置在屏幕范围内触发事件函数,一般这种按钮对于用户是按上了有反悔的机会

        还有一个方法是叫UIControlEventTouchDown,它是只要手指触碰到了按钮就直接触发函数

还有一个方法是叫UIControlEventTouchOutside,和indide相反,它是只有手指按下并移动到按钮外才会触发

3.  每个按钮可以调用多个函数,每个函数也可以被多个按钮调用

4. 当同一个函数被多个按钮调用的时候,如果想让它们对应输出的结果不相同,这时候就需要用到上面所说的一个办法:就是先让第二个参数传入的函数对象是带参数的,因为我们知道传入的带参数的函数它的参数为调用这个函数的按钮,因此,我们再在不同的按钮里面定义一个它们独特的标签,再在函数中用if选择来输出对应不同的值。

三、UIView基础

        1. UIView是iOS中的视图对象,它是现实在屏幕上的所有的对象的基础类(父类),所有显示在屏幕上的对象一定继承于UIView,它们一定是UIView的子类

        2. UIView是一个矩形对象,它有背景颜色,可以显示,并且有层级关系

        3. 其实frame是UIView的基本属性,因为屏幕上的对象是UIView的子类,所以它们也有。

        4. 将新建的视图添加到父亲视图上(即 [self.view addSubview: view];这一句),它完成了两步:1、将新建的视图显示到屏幕上;2、将输入的视图作为被调用的视图的子视图管理起来

        5. 也可以将当前视图从父视图上删除掉,使用removeFromSuperview即可,这时也会执行两个操作:(1)、从父视图的管理中删除;(2)、不会显示在屏幕

注:UIView的代码要写在如下位置

下面用代码演示:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //创建一个UIView对象
    UIView *view = [[UIView alloc] init];
    
    //设置UIView的位置
    view.frame = CGRectMake(150, 300, 100, 80);
    
    //设置UIView的颜色
    view.backgroundColor = [UIColor orangeColor];
    
    //是否隐藏视图对象
    //YES:隐藏;  NO:不隐藏
    view.hidden = NO;
    
    //设置是否显示不透明
    view.opaque = NO;
    
    //设置视图对象的透明度
    //alpha == 1,不透明;
    //alpha == 0,透明;
    //alpha == 0.5,半透明;
    //在0~1内各个小数都能取,小数的大小决定了透明度
    view.alpha = 0.7;
    
    //将自己从父亲视图删除掉
    [view removeFromSuperview];
    
    [self.view addSubview: view];
}


@end

运行结果:

3.1 隐藏视图对象:

1. 使用hidden:

view.hidden = YES;即可隐藏视图。(YES:隐藏,NO:不隐藏)

2. 使用alpha设置透明度,当透明度为0时即全透明了

3. 使用opaque,设置是否显示不透明

3.2 UIView的层级关系

1. UIView视图的覆盖顺序和在将视图添加到父视图上的关系是有关的,哪一个视图先被添加,就先绘制谁,更改视图的添加顺序,得到的图形的覆盖关系也是不同的

2. 如果想不改变添加顺序而该变视图的覆盖顺序,则可以使用bringSubviewToFront、sendSubviewToBack等方法来调整

3. subviews是管理所有的self.view的子视图的数组,当将某视图添加到父视图上时,就将该视图作为元素添加进了这个数组;当想要将某个视图从这个数组中清除掉,只需要调用removeFromSuperview即可。

用代码演示:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //首先创建三个视图
    UIView *view1 = [[UIView alloc] init];
    UIView *view2 = [[UIView alloc] init];
    UIView *view3 = [[UIView alloc] init];
    
    view1.frame = CGRectMake(100, 100, 100, 100);
    view2.frame = CGRectMake(125, 125, 125, 125);
    view3.frame = CGRectMake(150, 150, 150, 150);
    
    view1.backgroundColor = [UIColor redColor];
    view2.backgroundColor = [UIColor greenColor];
    view3.backgroundColor = [UIColor blueColor];
    
    
    //当view1、view2、view3的添加顺序不同的时候,视图的覆盖顺序也是不同的
    //即哪一个视图先被添加,就先绘制谁
    //在此处更改添加顺序,得到的图形覆盖关系是不同的
    [self.view addSubview: view1];
    [self.view addSubview: view2];
    [self.view addSubview: view3];
    
    //subviews是管理所有self.view的子视图的数组
    UIView *viewFront = self.view.subviews[2];
    UIView *viewBack = self.view.subviews[0];
    if (viewBack == view1) {
        NSLog(@"1相等");
    }
    //将某个视图从该数组中清除掉
    [view2 removeFromSuperview];
    
    
    //使用方法来调整视图覆盖关系
    //将某个视图调整到最前面显示
    [self.view bringSubviewToFront: view1];
    //将某个视图调整到最后面
    [self.view sendSubviewToBack: view3];
}


@end

 运行结果:

 

四、UIWindow对象

        UIWindow对象简介:

        一个UIWindow对象为应用程序的用户界面提供了背景以及重要的事件处理行为。
        UIWindow继承自UIView,我们一般不会直接去设置其UI展现,但它对展现程序中的views至关重要。每一个view,想要出现在屏幕上都依赖于window,但是程序中的window之间是相互独立的。应用程序收到事件之后会先转发给适当的window对象,从而又将事件转发给view对象。

        UIWindow的主要作用有:

        1.作为UIView的最顶层容器,包含应用显示所有的UIView;

        2.传递触摸消息和键盘事件给UIView;

                                                        (转自 cheng_xing_的博客)

        老版本UIWindow的代码是写在“AppDelegate.m”中的。但是现在都不在这里写了,现在写到SceneDelegate.m里面,而且UIWindow对象不需要你手动创建了。

        首先先解释一个函数:didFinishLaunchingWithOptions:当程序框架初始化成功后调用此函数,此函数用来初始化整个程序框架结构,是整个程序对iOS开发工程师的入口,每个app运行时都需要此函数。

        UIWindow的一些注意:

1. 当移动父视图的时候,子视图也会随之移动,是因为子视图是参照父视图的坐标系的

2. 每一个view都有一个window属性

3. 在后面写代码时,UIWindow要通过视图控制器来与UIView产生联系

4. 写代码的位置:

下面用代码演示:

#import "SceneDelegate.h"

@interface SceneDelegate ()

@end

@implementation SceneDelegate


- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    //首先是对UIWindow对象创建视图控制器
    self.window.rootViewController = [[UIViewController alloc] init];
    //对UIWindow设置背景颜色
    self.window.backgroundColor = [UIColor orangeColor];
    //可以直接给window上添加视图
    UIView *view1 = [[UIView alloc] initWithFrame: CGRectMake(100, 100, 100, 50)];
    view1.backgroundColor = [UIColor blackColor];
    //当创建一个新的背景视图,然后将这个视图作为window的子视图,再让view1作为背景视图的子视图,就会有一个层级关系
    //当移动背景视图的时候,view1视图也会随着移动,子视图是参照父视图的坐标系
    UIView *backView = [[UIView alloc] initWithFrame: CGRectMake(100, 300, 200, 200)];
    backView.backgroundColor = [UIColor redColor];
    [backView addSubview: view1];
    //将view1视图添加到window上
    [self.window addSubview: backView];

    //打印不同视图的window属性:
    NSLog(@"%@", view1.window);
    NSLog(@"%@", backView.window);
    NSLog(@"%@", self.window);
    //可以看出,它们三个的window属性是同一个window

    //使window有效并显示在屏幕上
    [self.window makeKeyAndVisible];

    }


- (void)sceneDidDisconnect:(UIScene *)scene {
    // Called as the scene is being released by the system.
    // This occurs shortly after the scene enters the background, or when its session is discarded.
    // Release any resources associated with this scene that can be re-created the next time the scene connects.
    // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
}


- (void)sceneDidBecomeActive:(UIScene *)scene {
    // Called when the scene has moved from an inactive state to an active state.
    // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}


- (void)sceneWillResignActive:(UIScene *)scene {
    // Called when the scene will move from an active state to an inactive state.
    // This may occur due to temporary interruptions (ex. an incoming phone call).
}


- (void)sceneWillEnterForeground:(UIScene *)scene {
    // Called as the scene transitions from the background to the foreground.
    // Use this method to undo the changes made on entering the background.
}


- (void)sceneDidEnterBackground:(UIScene *)scene {
    // Called as the scene transitions from the foreground to the background.
    // Use this method to save data, release shared resources, and store enough scene-specific state information
    // to restore the scene back to its current state.
}


@end

运行结果:

五、UIViewController基础

        UIViewController是一个视图控制器,创建完视图控制器对象后,要对它进行赋值操作。在整个UIKit中只有一个根视图控制器,属于window的属性。视图控制器用来管理界面和处理界面的逻辑类对象,程序启动前必须对根视图控制器赋值。

  • 视图控制器是传统的Model-View-Controller(MVC)设计模式中 —— 控制器对象

  • 视图控制器提供了许多控制器的基本功能,因为它是所有控制器的基类

  • 视图控制器负责创建和管理一组视图,它本身就提供了一个视图,称为该控制器的根视图(view),协调管理数据和视图之间的交互

  • 5.1 视图控制器的界面切换

  • 1. 先创建多个视图,并设定每个视图的颜色等属性,每个视图应该设置在不同的IOS-cocoa touch class项目中,并且各视图之间根据所需的关系来以父子类继承。

    2. 设置好视图后,在对应的视图文件的实现部分写入操作函数,如touchesBegan表示触碰屏幕即调用。

    3. 在对应的操作函数中,对对应的视图控制器对象调用presentViewController(显示一个新的视图控制器在界面)、dismissViewControllerAnimated(使当前视图控制器界面消失掉)等方法进行视图切换操作。

  • 用代码来演示:

  • 首先新建一个view02类:

    #import <UIKit/UIKit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface ViewC02 : UIViewController
    
    @end
    
    NS_ASSUME_NONNULL_END
    
    #import "ViewC02.h"
    
    @interface ViewC02 ()
    
    @end
    
    @implementation ViewC02
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //第二个控制器的颜色
        self.view.backgroundColor = [UIColor orangeColor];
        
    }
    
    - (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        
        //使当前的控制器消失掉,传入两个参数
        //第一个参数指是否有动画效果
        //第二个参数指结束后是否调用block块操作,不需要为nil
        [self dismissViewControllerAnimated: YES completion: nil];
    }
    
    /*
    #pragma mark - Navigation
    
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */
    
    @end
    

    然后在ViewController中写:

    #import "ViewController.h"
    #import "ViewC02.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    //当屏幕被点击的时候,调用此函数
    - (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        //创建视图控制器二
        ViewC02 *v2 = [[ViewC02 alloc] init];
        
        //显示一个新的视图控制器界面到屏幕上
        //该函数会传入三个参数:第一个参数指新的控制器对象
        //第二个参数指是否使用动画切换效果
        //第三个参数指切换结束后是否调用block块操作,不需要为nil
        [self presentViewController: v2 animated: YES completion: nil];
    }
    
    //当视图控制器第一次被加载显示视图的时,调用此函数
    //布局初始化视图来使用,初始化资源使用
    - (void)viewDidLoad {
        //调用父类的加载视图函数
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor blueColor];
        NSLog(@"viewDidLoad第一次加载视图");
    
        
        UIView *view = [[UIView alloc] init];
    
        view.frame = CGRectMake(100, 100, 100, 200);
    
        //将视图添加到当前控制视图上
        [self.view addSubview: view];
    
        view.backgroundColor = [UIColor orangeColor];
    
        self.view.backgroundColor = [UIColor blueColor];
    }
    
    //当视图控制器的视图即将显示的时候,调用此函数
    //参数:表示是否用动画切换后消失
    //每一次视图显示时都要被调用
    - (void) viewWillAppear:(BOOL)animated {
        NSLog(@"视图即将显示");
    }
    
    //当视图控制器的视图即将消失的时候,调用此函数
    //参数:表示是否用动画切换后消失
    //当前状态:视图还是显示在屏幕上的
    - (void) viewWillDisappear:(BOOL)animated {
        NSLog(@"视图即将消失");
    }
    
    //当视图控制器的视图已经显示到后的瞬间,调用此函数
    //参数:表示是否用动画切换显示的
    //当前状态:视图已经显示在屏幕上
    - (void) viewDidAppear:(BOOL)animated {
        NSLog(@"视图已显示");
    }
    
    //当视图控制器的视图已经从屏幕上消失,调用此函数
    //参数:表示是否用动画切换显示
    //当前状态:视图已经从屏幕上消失
    - (void) viewDidDisappear:(BOOL)animated {
        NSLog(@"视图已消失");
    }
    
    @end
    

    运行结果:

  • 点击后:

  •  

5.2 定时器与视图移动

        定时器的方法是scheduledTimerWithTimeInterval,,这个方法用于每隔一段时间执行一次事件函数,使用这个方法会穿进去三个参数:

        第一个参数指每隔多少秒执行一次事件函数

        第二个参数表示实现参数的对象

        第三个参数表示事件函数

        第四个参数表示可以为定时器函数传入一个函数,无参数可以传nil

        第五个参数表示该定时器是否重复操作,YES则重复,NO则仅一次

        返回值为一个新建好的定时器对象

        在使用定时器之前,要在ViewController的接口部分定义定时器的成员变量或者属性,然后在实现部分进行实现。

5.2.1 用定时器实现视图移动:

        首先在viewDidLoad部分创建一个视图对象,并对视图对象的tag标签赋值,然后在定时器的事件函数部分对其使用

        view.frame = CGRectMake(view.frame.origin.x+0.1, view.frame.origin.y+0.1, 80, 80);的语句,表示其位置随着每次调用定时器事件函数二改变。

        停止定时器的方法:调用invalidate方法。

用代码演示:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize timeView = _timeView;

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor colorWithRed: 0.1 green: 0.3 blue: 0.5 alpha: 0.8];
    
    UIButton *btn = [UIButton buttonWithType: UIButtonTypeRoundedRect];
    btn.frame = CGRectMake(100, 100, 180, 140);
    btn.backgroundColor = [UIColor colorWithRed:0.2 green:0.7 blue:0.7 alpha:1];
    [btn setTitle: @"启动定时器" forState: UIControlStateNormal];
    btn.titleLabel.font = [UIFont systemFontOfSize: 24];
    btn.tintColor = [UIColor blueColor];
    [btn addTarget: self action: @selector(pressStart) forControlEvents: UIControlEventTouchUpInside];
    [self.view addSubview: btn];
    
    UIButton *stopBtn = [UIButton buttonWithType: UIButtonTypeRoundedRect];
    stopBtn.frame = CGRectMake(100, 300, 180, 140);
    stopBtn.backgroundColor = [UIColor colorWithRed: 0.79 green: 0.29 blue: 0.71 alpha: 1];
    [stopBtn setTitle: @"停止定时器" forState: UIControlStateNormal];
    stopBtn.titleLabel.font = [UIFont systemFontOfSize: 24];
    stopBtn.tintColor = [UIColor orangeColor];
    [stopBtn addTarget: self action: @selector(pressStop) forControlEvents: UIControlEventTouchUpInside];
    [self.view addSubview: stopBtn];
    
    UIView *view = [[UIView alloc] init];
    view.backgroundColor = [UIColor orangeColor];
    //为view对象设置标签值
    view.tag = 101;
    [self.view addSubview: view];
}

- (void) pressStart {
    //NSTimer的类方法创建一个定时器并启动,该定时器传入五个参数
    //第一个参数指每隔多少秒执行一次事件函数
    //第二个参数表示实现参数的对象
    //第三个参数表示事件函数
    //第四个参数表示可以为定时器函数传入一个函数,无参数可以传nil
    //第五个参数表示该定时器是否重复操作,YES则重复,NO则仅一次
    //返回值为一个新建好的定时器对象
    _timeView = [NSTimer scheduledTimerWithTimeInterval: 0.001 target: self selector: @selector(updateTimer:) userInfo: @"喜多川海梦" repeats: YES];
}

//事件函数
//可以将定时器本身作为参数传入
- (void) updateTimer: (NSTimer*) timer {
    NSLog(@"suki!%@", timer.userInfo);
    UIView *view = [self.view viewWithTag: 101];
    view.frame = CGRectMake(view.frame.origin.x + 0.1, view.frame.origin.y + 0.1, 80, 80);
}

- (void) pressStop {
    //停止定时器
    if (_timeView != nil) {
        [_timeView invalidate];
    }
}
 
@end

运行结果:

六、UITextField控件

        textField是一个文本输入的控件,它用于从键盘上输入文本文字,它有一个特性是只能输入单行的文本,而不能输入或显示多行。

        UITextField是继承于UIControl的,UIControl是继承于UIView的。

        使用该控件之前,我们同样要先在接口部分定义UITextField的成员变量和属性,然后在实现部分实现。并初始化textField对象。

        该控件有一个borderStyle方法可以为输入框选择风格,有如下四种风格:

        -//圆角风格(默认)UITextBorderStyleRoundedRect;

        -//线框风格UITextBorderStyleLine;

        -//bezel线框UITextBorderStyleBezel;

        -//无边框风格UITextBorderStyleNone;

        然后,可以设置在输入时跳出键盘的风格:

        -//默认风格UIKeyboardTypeDefault;

        -//字母和数字组合风格UIKeyboardTypePhonePad;

        -//纯数字风格 UIKeyboardTypeNumberPad;

        还有其他方法可以用于使输入框没有文字时提示信息,作为密码输入隐藏密码等

        若输入完后想通过点击空白部分使键盘消失来结束输入,可以调用resignFirstResponder方法使得虚拟键盘回收,不再作为第一消息响应者,这个方法要另写在点击的函数中(touchesBegan)

        最后使输入框在视图中显示

6.1 UITextFieldDelegate协议

在这个协议里有一些函数,在使用这些函数前要先在接口部分声明这个协议,函数如下:

1、- (void) textFieldDidBeginEditing:在手机键盘弹出的一瞬间开始调用,在这里可以为开始输入时添加动作

2、- (void) textFieldDidEndEditing:在手机键盘收回的一瞬间开始调用,在这里可以为结束输入时添加动作

3、- (BOOL) textFieldShouldBeginEditing:表示是否可以进行输入,返回值为YES的时候可以输入,反之不能输入,默认为YES

4、- (BOOL) textFieldShouldEndEditing:表示是否可以结束输入,返回值为YES的时候可以结束,反之不能结束,默认为YES

下面用代码在ViewController中演示:

#import <UIKit/UIKit.h>

//UITextFieldDelegate是UITextField的一个协议
@interface ViewController : UIViewController <UITextFieldDelegate> {
    //定义一个textField
    UITextField *_textField;
}

//定义属性
@property (retain, nonatomic) UITextField *textField;

@end
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize textField = _textField;

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //创建textField对象
    self.textField = [[UITextField alloc] init];
    self.textField.frame = CGRectMake(100, 200, 200, 50);
    //为输入框添加内容文字
    self.textField.text = @"用户名";
    //为输入框的文字设置风格和大小
    self.textField.font = [UIFont systemFontOfSize: 17];
    //设置字体颜色
    self.textField.textColor = [UIColor blueColor];
    
    //设置输入边框的风格
    //圆角风格(默认)
    self.textField.borderStyle = UITextBorderStyleRoundedRect;
    //线框风格
    //self.textField.borderStyle = UITextBorderStyleLine;
    //bezel线框
    //self.textField.borderStyle = UITextBorderStyleBezel;
    //无边框风格
    //self.textField.borderStyle = UITextBorderStyleNone;
    
    //设置键盘风格,在此处测试的时候虚拟机的手机键盘可能跳不出来,只需要直接cmd+K呼出,或者先点虚拟机然后在上方的I/O选择keyboard然后再选择第三个即可
    //默认风格
    self.textField.keyboardType = UIKeyboardTypeDefault;
    //字母和数字组合风格
    //self.textField.keyboardType = UIKeyboardTypePhonePad;
    //纯数字风格
    //self.textField.keyboardType = UIKeyboardTypeNumberPad;
    
    //当输入框内没有文字的时候,提示这条信息
    //默认半透明浅灰色提示
    self.textField.placeholder = @"请输入用户名......";
    
    //是否作为密码输入
    //当传入YES的时候,即作为密码处理,使用圆点加密;传入NO则正常输入
    self.textField.secureTextEntry = NO;
    
    [self.view addSubview: _textField];
    
}

//回收键盘(点击屏幕空白处调用)
- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    //使虚拟键盘回收,不再作为第一消息响应者
    [self.textField resignFirstResponder];
}

//UITextFieldDelegate协议里的一些函数--------------------------------------------------------------------------------------------------------------

//在手机键盘弹出的一瞬间开始调用,在这里可以为开始输入时添加动作
- (void) textFieldDidBeginEditing:(UITextField *)textField {
    NSLog(@"开始编辑了");
}

//在手机键盘收回的一瞬间开始调用,在这里可以为结束输入时添加动作
- (void) textFieldDidEndEditing:(UITextField *)textField {
    NSLog(@"编辑输入结束了");
}

//表示是否可以进行输入,返回值为YES的时候可以输入,反之不能输入,默认为YES
- (BOOL) textFieldShouldBeginEditing:(UITextField *)textField {
    return YES;
}

//表示是否可以结束输入,返回值为YES的时候可以结束,反之不能结束,默认为YES
- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
    return YES;
}

@end

运行结果:

 七、UIScrollView滚动视图

  • UIScrollView :顾名思义就是 可以滚动的 UIView。
  • 由于手机的屏幕比较小,所以直接可以展示在用户眼前的内容极其有限
  • 当展示的内容较多且超出一个屏幕时,用户可以通过手势滑动来查看屏幕以外的东西
  • 普通的UIView不具备滚动的功能,所以不适合展示较多的内容
  • UIScrollView就是一个可以滚动的UIView,用来展示大量的内容,并且可以通过滚动来展示所有内容
  • UIScrollView实例:手机上可上下滑动的页面都是,如QQ聊天页面

7.1 滚动视图的高级属性

  •         在滚动视图中,UIScrollView有一个协议叫UIScrollViewDelegate,实现这个协议,我们就可以调用该协议中的一些函数,见代码

代码演示:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //定义并创建一个滚动视图并设置其位置,滚动视图可以对视图内容进行滚屏查看
    UIScrollView *sv = [[UIScrollView alloc] initWithFrame: CGRectMake(0, 0, 394, 852)];
    
    //是否按照整页滚动视图
    sv.pagingEnabled = YES;
    //是否可以开启滚动效果
    sv.scrollEnabled = YES;
   
    //设置画布的大小,画布显示在滚动视图的内部,一般大于frame的大小,第一个参数表示宽,第二个表示高
    sv.contentSize = CGSizeMake(394 * 5, 852);
    
    //是否可以边缘弹动效果
    sv.bounces = YES;
    //开启横向弹动效果
    sv.alwaysBounceHorizontal = YES;
    //开启纵向弹动效果
    sv.alwaysBounceVertical = NO;
   
    //是否显示横向滚动条
    sv.showsHorizontalScrollIndicator = NO;
    //是否显示纵向滚动条
    sv.showsVerticalScrollIndicator = NO;
    
    for (int i = 0; i < 5; i++) {
        NSString *imageName = [NSString stringWithFormat: @"xxp%d.jpg", i + 1];
        UIImage *aImage = [UIImage imageNamed: imageName];
        UIImageView *aView = [[UIImageView alloc] initWithImage: aImage];
        aView.frame = CGRectMake(394 * i, 0, 394 , 852);
        [sv addSubview: aView];
    }
    
    
    //设置背景颜色
    sv.backgroundColor = [UIColor orangeColor];
    
    [self.view addSubview: sv];
}


@end

        其中xxp%d.jpg是图片文件名,如果需要读入文件,应该先将文件放入该代码文件中

运行结果:

横向划屏后:

 八、步进器和分栏控件

在ViewController用代码演示该控件的用处:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {
    UIStepper *_stepper;
    UISegmentedControl *_segControl;
}

@property (retain, nonatomic) UIStepper *stepper;
@property (retain, nonatomic) UISegmentedControl *segControl;

@end
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize stepper = _stepper;
@synthesize segControl = _segControl;

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //创建步进器---------------------------------------------------------------------------------------
    _stepper = [[UIStepper alloc] init];
    //同样的,步进器的位置可以变,但大小不可变,后两个参数没用
    _stepper.frame = CGRectMake(150, 200, 100, 100);
    //设置步进器步数最大值
    _stepper.minimumValue = 0;
    //设置步进器步数最小值
    _stepper.maximumValue = 100;
    //设置步进器步数当前值
    _stepper.value = 50;
    //设置步进器每走一步的步数大小值
    _stepper.stepValue = 10;
    //是否可以重复相应事件操作,这个为YES的时候,长按步进器的按钮,就会持续一直执行事件函数
    //这个为NO的时候,就只会在按下的时候执行一次事件函数,松开再按才会执行下一次
    _stepper.autorepeat = YES;
    //是否将步进结果通过事件函数相应出来
    //当这个为YES的时候,它会一边执行步进器,一边执行事件函数,确保每一次步进的值都会调用事件函数
    //当这个为NO的时候,它只会执行步进器,但是不会执行事件函数,只有在手指松开步进器按钮的时刻才会把当前的值调用一次事件函数
    _stepper.continuous = NO;
    //添加事件函数
    [_stepper addTarget: self action: @selector(pressStepper) forControlEvents: UIControlEventValueChanged];
    [self.view addSubview: _stepper];
    
    //创建分栏控件--------------------------------------------------------------------------------------
    _segControl = [[UISegmentedControl alloc] init];
    //这个控件宽度可变,但是高度不可变
    _segControl.frame = CGRectMake(150, 300, 200, 50);
    //向分栏控件中添加按钮元素,传入三个参数
    //第一个参数表示添加的按钮的名字的文本内容
    //第二个参数表示添加的按钮在控件中的索引
    //第三个参数表示选择按钮时是否使用切换动画
    [_segControl insertSegmentWithTitle: @"0x" atIndex: 0 animated: YES];
    [_segControl insertSegmentWithTitle: @"1x" atIndex: 1 animated: YES];
    [_segControl insertSegmentWithTitle: @"2x" atIndex: 2 animated: YES];
    //设置控件当前所在的索引值
    _segControl.selectedSegmentIndex = 0;
    //为控件添加事件函数
    [_segControl addTarget: self action: @selector(segChange) forControlEvents: UIControlEventValueChanged];
    [self.view addSubview: _segControl];
}

- (void) segChange {
    NSLog(@"%ld", _segControl.selectedSegmentIndex);
}

- (void) pressStepper {
    NSLog(@"已完成一次步进,当前值%.1f", _stepper.value);
}

@end

运行结果:

步进器的使用测试结果:

 分栏控件的使用测试结果:

 九、UISwitch

        UISwitch是一个开关控件,可以进行状态的改变,有开 关两种状态可以切换,是UIKit库里的控件

        苹果官方的控件都保存在UIkit中,UIKit中的控件都以UI开头

        和定时器一样 在使用UISwitch之前 都需要在接口部分声明一个成员变量或者属性,然后在实现部分实现。

        接下来,在实现部分的第一个函数里创建继承于UIView的UISwitch对象,然后就可以设置其属性。要注意的是,设置它的frame属性的时候,只能改变它的位置而不能改变它的大小,即只有前两个参数代表的X,Y是有意义的,后两个代表宽高的没意义。

        然后是设置开关的打开关闭状态,对其的on属性赋YES或者NO,表示其状态,当然也可以用set语法,即[对象名 setOn: YES/NO]和[对象名 setOn: YES/NO animated: YES/NO];后者的第二个参数的意思是是否使用动画效果。

        开关的按钮颜色是可以设置的 用setOnTintColor即可设置,当然背景颜色也可以设置 但是设了很丑建议别设 圆钮的颜色也可以单独设 用setThumbTintColor方法 设置整体风格颜色 用setTintColor。

接下来在ViewController写代码演示:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {
    UISwitch *mySwitch;
    NSTimer *myTimer;
}

@property (retain, nonatomic) UISwitch *mySwitch;
@property (retain, nonatomic) NSTimer *myTimer;

@end

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize mySwitch = _mySwitch;
@synthesize myTimer = _myTimer;

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //创建一个继承于UIView的开关对象
    _mySwitch = [[UISwitch alloc] init];
    
    //UISwitch控件的位置X,Y可以改变,但是它的大小(宽高)无法改变,即后两个数字没用
    _mySwitch.frame = CGRectMake(150, 200, 80, 40);
    
    [_mySwitch setOn: YES animated: YES];
    [_mySwitch setOnTintColor: [UIColor colorWithRed: 0.8 green: 0.2 blue: 0.4 alpha: 0.7]];
    
    [_mySwitch addTarget: self action: @selector(pressA) forControlEvents: UIControlEventValueChanged];
    
    [self.view addSubview: _mySwitch];
}

- (void) pressA {
    
    _myTimer = [NSTimer scheduledTimerWithTimeInterval: 0.5 target: self selector: @selector(pressB) userInfo: @"喜多川海梦" repeats: YES];
}

- (void) pressB {
    NSLog(@"suki!%@",_myTimer.userInfo);
}

@end

运行结果:

 点击开关后:

 

十、进度条和滑动条

在ViewController中写代码演示:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {
    //进度条对象一般用来表示下载或视频播放的进度(被动)
    UIProgressView *_progressView;
    
    //滑动条一般用来进行调整音量等(用户可以主动调整)
    UISlider *_slider;
}

@property (retain, nonatomic) UIProgressView *pView;
@property (retain, nonatomic) UISlider *pSlider;

@end
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize pSlider = _slider;
@synthesize pView = _progressView;

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //创建进度条
    _progressView = [[UIProgressView alloc] init];
    _progressView.frame = CGRectMake(150, 100, 200, 80);
    _progressView.progressTintColor = [UIColor blueColor];
    //设置进度条的进度,传入的参数是0~1的值
    _progressView.progress = 0.5;
    //设置进度条风格特征
    _progressView.progressViewStyle = UIProgressViewStyleDefault;
    [self.view addSubview: _progressView];
    
    //创建滑动条
    _slider = [[UISlider alloc] init];
    //滑动条的高度是不可改变的
    _slider.frame = CGRectMake(150, 200, 200, 80);
    _slider.tintColor = [UIColor orangeColor];
    //设置滑动条最大值,最小值,最小值可以为负
    _slider.maximumValue = 100;
    _slider.minimumValue = 0;
    //设置滑动条滑块的位置
    _slider.value = 30;
    
    //设置左侧滑条颜色
    _slider.minimumTrackTintColor = [UIColor orangeColor];
    //设置右侧滑条颜色
    _slider.maximumTrackTintColor = [UIColor brownColor];
    //设置滑块颜色
    _slider.thumbTintColor = [UIColor purpleColor];
    
    //为滑动条添加事件函数
    [_slider addTarget: self action: @selector(pressSlider) forControlEvents: UIControlEventValueChanged];
    
    [self.view addSubview: _slider];
}

- (void) pressSlider {
    //使进度条随着滑动条的变化而变化
    _progressView.progress = (_slider.value - _slider.minimumValue) / (_slider.maximumValue - _slider.minimumValue);
    NSLog(@"value = %f", _slider.value);
}

@end

运行结果:

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值