目录
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
运行效果如下:
标签:控件,控制器,self,视图,C语言,学习,UI,YES,void From: https://blog.csdn.net/2301_80095702/article/details/139305444