OC语言学习——UI(一)

  

目录

  

UIView

1.UIView的基础概念

2.UiView的层级关系

UIWindow

UIViewController

1.UIViewController基础

2.UIViewController的使用

定时器和视图移动

UISwitch控件

步进器和分栏控件

警告对话框和操作表

UITextField

UIScrollView基础

滚动视图的高级功能


UIView

1.UIView的基础概念

1.UIView也就是oc中的视图,他是显示在屏幕上的所有对象的父类

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

3.将新建的视图加入到父视图中实现了两项功能:(1)将新建的视图显示到屏幕上(2)将新建的视图作为父视图的子视图来管理

4.可以使用removeFromSuperview来将视图从当前父视图中删除

下面用代码来演示一下UIView的基本功能和用法

下面是效果图:

2.UiView的层级关系

1.UIView的层级关系表示的是几个视图之间的覆盖关系,一般来说,先添加的视图就会被后添加的视图盖住

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

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

用代码来演示一下效果:

运行结果:

UIWindow

举一些UIWindow在实际生活中应用的情景来辅助理解:

1.老版本UIWindow的代码写在“AppDelegate.m”中,但是现在写到SceneDelegate.m中,并且不需要手动创建UIWindow对象。

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

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

4.UIWindow通过视图控制器UIViewController与UIView产生联系

接下来用代码来演示一下:

运行结果:

在学习老版本的UIwWindow的知识时,还涉及到了一个函数,与这个函数有关的知识如下图:

UIViewController

1.UIViewController基础

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

所有的视图控制器都需要自定义来完成,继承于UIViewController

视图控制器提供了许多控制器的基本功能,因为它是所有控制器的基类视图控制器负责创建和管理一组视图,它本身就提供了一个视图,称为该控制器的根视图(view),协调管理数据和视图之间的交互

2.UIViewController的使用

可以通过多个UIViewController来实现不同界面之间的切换。

新建类来创建新的视图控制器UIViewController,并根据各视图控制器之间关系来确定父子类关系

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

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

下面用代码来演示一下:

首先新建一个视图控制器类

然后在ViewController中完成操作函数的实现

运行的结果如下:

点击后:

定时器和视图移动

可以在视图控制器中定义一个定时器属性 通过定时器来实现视图连贯的移动

使用如下方法来创建并启动定时器:

接下来用代码来演示一下如何通过定时器来实现视图连贯的移动:

1.这里移动视图时,需要用到视图标签这个属性(可以理解为指针),通过标签来改变视图的frame属性

2.停止定时器时,可以调用invalidate方法

3.视图的移动是通过定时器的方法里的事件函数实现的,也就是说,视图的移动要写在定时器调用的方法的事件函数里

运行结果:

UISwitch控件

UISwitch是一个开关控件,可以切换开、关两种状态,是UIKit库里的控件

UISwitch在使用时,可以先在接口部分声明属性,也可以直接在实现部分定义变量

UISwitch只能改变位置不能改变大小

UISwitch添加事件的操作与按钮类似,调用下图方法:

下面用代码来演示一下开关控件的功能与用法:

接口部分:

实现部分:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    //创建一个开关控件
    //继承于UIView
    _mySwitch = [[UISwitch alloc] init];
    
    //苹果官方的控件的位置设置
    //位置x,y的值可以改变
    //宽度和高度值无法改变
    _mySwitch.frame = CGRectMake(100, 100, 80, 40);
    _mySwitch.backgroundColor = [UIColor magentaColor];
    
    //开关状态设置属性
    //YES:开启状态
    //NO:关闭状态
    _mySwitch.on = YES;
    //也可以使用set函数
    [_mySwitch setOn:YES];
    
    //设置开关状态
    //第一个参数是状态设置
    //第二个参数是是否开启动画效果
    [_mySwitch setOn:YES animated:YES];
    
    [self.view addSubview:_mySwitch];
    
    //设置开启状态的风格颜色
    [_mySwitch setOnTintColor: [UIColor cyanColor]];
    //设置开关按钮的风格颜色
    [_mySwitch setThumbTintColor:[UIColor greenColor]];
    
    //设置整体风格颜色
    [_mySwitch setTintColor:[UIColor redColor]];
    //(好像没用)
    //向开关控件添加事件函数
    //第一个参数是函数实现的对象
    //第二个参数是函数对象
    //第三个参数是事件响应时的事件类型UIControlEventValueChanged:状态发生变化时触发函数
    [_mySwitch addTarget:self action:@selector(swChange:) forControlEvents:UIControlEventValueChanged];
    self.view.backgroundColor = [UIColor whiteColor];
}

//参数穿入开关对象本身
- (void)swChange:(UISwitch*) sw{
    if (sw.on == YES){
        NSLog(@"开关被打开");
    } else {
        NSLog(@"开关被关闭!");
    }
    NSLog(@"开关状态发生变化!");
}

运行结果如下:

点击后:

步进器和分栏控件

步进器是一种用来增加或减少固定值的控件,分栏控件是一种用来选择栏目的控件,比如在打车软件中选择价位

下面用代码来演示一下步进器和分栏控件的功能与用法

接口部分:

#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];
    // Do any additional setup after loading the view.
    
    //创建步进器对象
    _stepper = [[UIStepper alloc] init];
    //设置位置,宽高不可改变
    _stepper.frame = CGRectMake(100, 100, 80, 40);
    
    //设置步进器的最小值
    _stepper.minimumValue = 0;
    
    //设置步进器的当前值,默认为0
    _stepper.value = 10;
    
    //设置步进值,每次向前或向后步进的步伐值
    _stepper.stepValue = 1;
    
    //是否可以重复响应时间操作
    _stepper.autorepeat = YES;
    
    //是否将步进结果通过事件函数响应出来
    _stepper.continuous = NO;
    
    //添加一个事件函数
    //第一个参数是函数实现体
    //第二个参数是函数题
    //第三个参数是事件值改变状态
    [_stepper addTarget:self action:@selector(stepchange) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:_stepper];
    
    //创建分栏控件
    _segControl = [[UISegmentedControl alloc] init];
    //设置控件位置,宽度可变,高度不可变
    _segControl.frame = CGRectMake(10, 200, 300, 40);
    //添加一个按钮元素
    [_segControl insertSegmentWithTitle:@"0元" atIndex:0 animated:NO];
    
    //第一个参数是按钮选项文字
    //第二个参数是按钮的索引位置
    //第三个参数是是否有插入的动画效果
    [_segControl insertSegmentWithTitle:@"5元" atIndex:1 animated:NO];
    [_segControl insertSegmentWithTitle:@"10元" atIndex:2 animated:NO];
    
    //当前按钮默认索引位置
    _segControl.selectedSegmentIndex = 0;
    [_segControl addTarget:self action:@selector(segChange) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:_segControl];
}

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

- (void)stepchange {
    NSLog(@"step change! value = %f", _stepper.value);
}
@end

效果图:

警告对话框和操作表

UIAlertController有两种形式,一种是警告框,一种是操作表

通过不同的preferredStyle来创建两种控件

  • 警告框的是UIAlertControllerStyleAlert
  • 操作表的是UIAlertControllerStyleActionSheet

取消按钮的style的就是UIAlertActionStyleCancel
默认按钮的style就是UIAlertActionStyleDefault

下面用代码演示一下:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize alertController = _alertController;
@synthesize activityIndicatorView = _activityIndicatorView;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    for (int i = 0; i < 2; i++) {
        UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        btn.frame = CGRectMake(100, 100 + 100 * i, 100, 40);
        if (i == 0) {
            [btn setTitle:@"警告对话框" forState:UIControlStateNormal];
        } else if (i == 1) {
            [btn setTitle:@"操作表" forState:UIControlStateNormal];
        }
        btn.tag = 101 + i;
        [btn addTarget:self action:@selector(pressBtn:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btn];
    }
}

- (void)pressBtn:(UIButton*)btn {
    //警告对话框创建
    if (btn.tag == 101) {
        //创建警告框
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"警告" message:@"手机没电了" preferredStyle:UIAlertControllerStyleAlert];
        //添加操作按钮
        UIAlertAction* action = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            NSLog(@"已确认");
        }];
        [alertController addAction:action];
        //添加取消按钮
        UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
        //将取消按钮添加到我们的警告框中
        [alertController addAction:cancelAction];
        //在视图控制器中呈现警告框(通过这个方法将其弹出)
        [self presentViewController:alertController animated:YES completion:nil];
        //这里可以在警告框里添加我们的文本框
        [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
            textField.placeholder = @"请说出你的感受";
        }];
    } else if (btn.tag == 102) {
        //创建操作表
        self.alertController = [UIAlertController alertControllerWithTitle:@"操作表" message:@"来做一些操作吧" preferredStyle:UIAlertControllerStyleActionSheet];
        //其实alertSheet唯一与警告对话框的区别就是我们的preferredStyle的样式不同
        //这里default就是选择默认的选项
        UIAlertAction* action1 = [UIAlertAction actionWithTitle:@"操作1" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            NSLog(@"点击了项目1");
        }];
        UIAlertAction* action2 = [UIAlertAction actionWithTitle:@"操作2" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            NSLog(@"点击了项目2");
        }];
        //创建取消操作
        UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
            NSLog(@"取消了");
        }];
        [self.alertController addAction:action1];
        [self.alertController addAction:action2];
        [self.alertController addAction:cancel];
        //注意alertController时viewController的子类 不能直接添加为子视图
        [self presentViewController:self.alertController animated:YES completion:nil];
    }
}


@end

运行的效果如下:

警告对话框:

操作表:

UITextField

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

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

可以用一个borderStyle选择文本框的四种风格:

1.圆角风格(默认)UITextBorderStyleRoundedRect;

2.线框风格UITextBorderStyleLine;

3.bezel线框UITextBorderStyleBezel;

4.无边框风格UITextBorderStyleNone;

还可以选择键盘的风格:

1.默认风格UIKeyboardTypeDefault;

2.字母和数字组合风格UIKeyboardTypePhonePad;

3.纯数字风格 UIKeyboardTypeNumberPad;

可以设置输入时视为密码输入,输入时就会将输入的东西转化为星号

可以使用touchesdown点击函数来实现点击空白处收起键盘

UITextField有一个UITextFieldDelegate协议,在声明后可以使用一些协议中的函数

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

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

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

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

下面用代码演示一下:

#import "ViewController.h"

@interface ViewController () <UITextViewDelegate>

@end

@implementation ViewController

@synthesize textField = _textField;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.textField = [[UITextField alloc] init];
    self.textField.frame = CGRectMake(100, 100, 100, 40);
    //设置内容文字
    self.textField.text = @"用户名";
    self.textField.font = [UIFont systemFontOfSize:15];
    self.textField.textColor = [UIColor orangeColor];
    //设置边框风格
    //UITextBorderStyleRoundedRect:圆角风格
    //UITextBorderStyleLine:线框风格
    //UITextBorderStyleBezel:bezel:bezel线框
    //UITextBorderStyleNone:无边框风格
    //默认为圆角风格
    self.textField.borderStyle = UITextBorderStyleRoundedRect;
    //设置虚拟键盘风格
    //UIKeyboardTypeDefault:默认风格
    //UIKeyboardTypeNamePhonePad:字母和数字组合的风格
    //UIKeyboardTypeNumberPad:纯数字风格
    self.textField.keyboardType = UIKeyboardTypeDefault;
    //提示文字信息
    //当text属性为空,显示此条信息
    //浅灰色提示文字
    self.textField.placeholder = @"请输入用户名...";
    
    //是否作为密码输入
    //YES:作为密码处理,圆点加密
    //NO:显示输入的文字
    self.textField.secureTextEntry = NO;
    [self.view addSubview:self.textField];
}

- (void) textViewDidBeginEditing:(UITextView *)textView {
    NSLog(@"开始编辑了!");
}

- (void) textViewDidEndEditing:(UITextView *)textView {
    self.textField.placeholder = @"";
    NSLog(@"编辑输入结束!");
}

//是否可以进行输入
//如果返回值为YES,可以进行输入,默认为YES
//NO:不能输入文字
- (BOOL) textViewShouldBeginEditing:(UITextView *)textView {
    return YES;
}

//是否可以结束输入
//如果返回值为YES,可以结束输入,默认为YES
//NO:不能结束输入文字
- (BOOL) textViewShouldEndEditing:(UITextView *)textView {
    return YES;
}

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


@end

运行结果:

UIScrollView基础

UIScrollView就是一个可以滚动的视图,比如说微信的聊天界面,就是一种UIScrollViewde的应用

用代码来演示一下滚动视图的功能和用法:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    //定义并创建一个滚动视图
    //可以对视图内容进行滚屏查看功能
    UIScrollView* sv = [[UIScrollView alloc] init];
    //设置滚动视图的位置,使用矩形来定位视图位置
    sv.frame = CGRectMake(0, 0, 320, 576);
    
    //是否按照整页来滚动
    sv.pagingEnabled = NO;
    //是否可以开启滚动效果
    sv.scrollEnabled = YES;
    //设置画布的大小,显示在滚动视图内部,一般大雨Frame的大小
    sv.contentSize = CGSizeMake(320 * 5, 576);
    //是否可以边缘弹动效果
    sv.bounces = YES;
    //开启横向弹动效果
    sv.alwaysBounceVertical = YES;
    //开启纵向弹动效果
    sv.alwaysBounceHorizontal = YES;
    //显示横向滚动条
    sv.showsHorizontalScrollIndicator = YES;
    //显示纵向滚动条
    sv.showsHorizontalScrollIndicator = YES;
    //设置背景颜色
    sv.backgroundColor = [UIColor yellowColor];
    
    for(int i = 0; i < 5; i++) {
        NSString* strname = [NSString stringWithFormat:@"%d.jpg",i + 1];
        UIImage* image = [UIImage imageNamed:strname];
        UIImageView* iView = [[UIImageView alloc] initWithImage:image];
        iView.frame = CGRectMake(320 * i, 0, 320, 576);
        [sv addSubview: iView];
    }
    [self.view addSubview:sv];
}


@end

运行结果如下:

滚动视图的高级功能

滚动视图有一个叫做UIScrollViewDelegate,如同文本框的协议,我们在声明滚动视图的协议后,可以调用里面的一些函数

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    //创建滚动视图
    _scrollView = [[UIScrollView alloc] init];
    //设置位置
    _scrollView.frame = CGRectMake(10, 50, 300, 400);
    //设置背景颜色
    _scrollView.backgroundColor = [UIColor redColor];
    //取消弹动效果
    _scrollView.bounces = NO;
    //是否允许通过点击屏幕让滚动视图响应事件
    //YES:滚动视图可以接受触碰事件
    //NO:不接受触屏事件
    //_scrollView.userInteractionEnabled = NO;
    
    //设置画布大小,纵向效果
    _scrollView.contentSize = CGSizeMake(300, 400 * 9);
    for (int i = 0; i < 9; i++) {
        NSString* strName = [NSString stringWithFormat:@"%d.jpg",i + 1];
        UIImage* image = [UIImage imageNamed:strName];
        //创建图像视图对象
        UIImageView* iView = [[UIImageView alloc] init];
        //图像赋值
        iView.image = image;
        //设置图像视图在滚动视图画布中的位置
        iView.frame = CGRectMake(0, 400 * i, 300, 400);
        [_scrollView addSubview:iView];
    }
    
    [self.view addSubview:_scrollView];
    //取消按页滚动效果
    _scrollView.pagingEnabled = NO;
    //滚动视图画布的移动位置,也就是偏移位置
    //功能是决定画布现实的最终图像结果
    _scrollView.contentOffset = CGPointMake(0, 0);
    
    //将当前视图控制器作为代理对象
    _scrollView.delegate = self;
}

//当滚动视图移动时,只要offset坐标发生变化,就会调用此函数
//参数是调用此协议的滚动视图对象
//可以使用此函数来监控滚动视图的位置
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSLog(@"y = %f", scrollView.contentOffset.y);
}

//当滚动视图结束拖动时调用此函数
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    NSLog(@"Did End Drag");
}

//当滚动视图即将开始被拖动时
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    NSLog(@"willBeginDrag!");
}

//当滚动视图即将结束拖动时调用
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    NSLog(@"即将结束拖动");
}

//视图即将减速时调用
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
    NSLog(@"will begin decelerating");
}

//视图停止的瞬间调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    NSLog(@"视图停止移动!");
}
@end

运行效果如下:

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值