UI学习(一)
- UILabel
- UIButton
- UIButton事件
- UIView
- UIView对象的隐藏
- UIView的层级关系
- UIWindow
- UIViewController
- 定时器与视图对象
- UISwitch
UILabel
UILabel是一种可以显示在屏幕上,显示文字的一种UI。
下面使用代码来演示UILabel的功能:
@implementation ViewController
- (void)createUI
{
UILabel* label = [[UILabel alloc] init];
//显示的文字
label.text = @"燕子,没有你我怎么活啊";
//label显示的位置
label.frame = CGRectMake(10, 300, 350, 200);
//label的背景颜色
label.backgroundColor = [UIColor greenColor];
//整个屏幕的背景颜色
self.view.backgroundColor = [UIColor redColor];
//将label显示在屏幕上
[self.view addSubview:label];
//label中文字的大小,标准大小34
label.font = [UIFont systemFontOfSize:34];
//label中文字阴影的颜色
label.shadowColor = [UIColor grayColor];
//阴影的偏移位置
label.shadowOffset = CGSizeMake(3, 0);
//label中文字显示的行数,当等于0时,系统自行判断显示多少行合适
label.numberOfLines = 0;
//label中文字的颜色
label.textColor = [UIColor whiteColor];
//默认文字在label中靠左显示,这里将文字改为在label中间显示
label.textAlignment = NSTextAlignmentCenter;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self createUI];
}
@end
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
:返回了一个结构体CGRect,GRect结构在屏幕上定义了一个矩形,它包含和大小。
它是用来定义一个矩形的,CGFloat x是对应屏幕的横向(x坐标), CGFloat y对应就是纵向(y坐标)。这里注意一点,描点是从屏幕的左上方开始的。
NSTextAlignmentLeft/Center/Right
:文字靠左、居中、靠右。
效果图:
UIButton
@implementation ViewController
-(void) createUIRectButton
{
UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(20, 300, 300, 50);
btn.backgroundColor = [UIColor greenColor];
//向按钮普通状态添加文字
[btn setTitle:@"按钮01" forState:UIControlStateNormal];
//向按钮高亮状态提供文字
[btn setTitle:@"按钮01已按下" forState:UIControlStateHighlighted];
//设置按钮文字普通状态的颜色
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
//设置按钮高亮状态文字的颜色
[btn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
//设置文字的字体大小
btn.titleLabel.font = [UIFont systemFontOfSize:24];
//下面又定义了一个按钮
UIButton* btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn2.frame = CGRectMake(50, 150, 300, 50);
btn2.backgroundColor = [UIColor brownColor];
[btn2 setTitle:@"按钮02" forState:UIControlStateNormal];
[btn2 setTitle:@"按钮02已按下" forState:UIControlStateHighlighted];
[btn2 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn2 setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
btn2.titleLabel.font = [UIFont systemFontOfSize:24];
btn.tag = 123;btn2.tag = 321;
//UIButton事件
[btn addTarget:self action:@selector(action01:) forControlEvents:UIControlEventTouchUpInside];
[btn2 addTarget:self action:@selector(action01:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
[self.view addSubview:btn2]
}
-(void)action01:(UIButton*) btn
{
if(btn.tag == 123){
NSLog(@"玛卡巴卡");
} else if(btn.tag == 321){
NSLog(@"汤姆布利波");
}
}
-(void)creatBtn
{
UIButton* btnp = [UIButton buttonWithType:UIButtonTypeCustom];
//UIButton* btno1 = [UIButton buttonWithType:UIButtonTypeCustom];
btnp.frame = CGRectMake(20, 400, 400, 400);
//加载两张图片,imageNamed后是图片名,要加图片类型
UIImage* ima1 = [UIImage imageNamed:@"im1.jpg"];
UIImage* ima2 = [UIImage imageNamed:@"im2.jpg"];
//为图片按钮设置当状态不同呈现的图片
[btnp setImage:ima1 forState:UIControlStateNormal];
[btnp setImage:ima2 forState:UIControlStateHighlighted];
[self.view addSubview:btnp];
//UIButton事件
[btn addTarget:self action:@selector(action01:) forControlEvents:UIControlEventTouchUpInside];
}
-(void) action02
{
NSLog(@"Don't fukin touch it");
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self createUIRectButton];
[self creatBtn];
}
@end
效果图:
UIButton事件结果:
UIButton事件
addTarget:
selfaction:
@selector(action02)forControlEvents:
UIControlEventTouchUpInside]:向按钮添加事件的函数,当函数满足第三处要求时,执行第二处的方法。UIControlEventTouchUplnside
:当目标在控件内部结束触摸屏幕并松开时(在按钮范围内),会触发该事件。UIControlEventTouchUpOutside
:当目标在控件内部结束触摸屏幕并松开时(在按钮范围外结束),会触发该事件。UIControlEventTouchDown
:当目标在控件内部开始触摸屏幕(按钮)时,触发该事件。- 可以一个事件控制几个按钮,例如程序中的玛卡巴卡和汤姆布利波,这里为了区分两个按钮,使用btn.tag区分两个按钮,也可以一个按钮触发多个事件。
UIView
UIView
- 是iOS的视图对象
- 是所有显示在屏幕上的基础类。
- 所有显示在屏幕上的对象,都继承于UIView
- UIView有背景颜色,矩形对象,有层级关系
示例程序:
@implementation ViewController
-(void) create
{
//创建一个UIView对象
UIView* view = [[UIView alloc] init];
view.frame = CGRectMake(80, 200, 100, 100);
view.backgroundColor = [UIColor redColor];
//将视图做为父视图的子视图管理起来
[self.view addSubview:view];
//view1.backgroundColor = [UIColor greenColor];
//[self.view addSubview:view1];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self create];
}
@end
效果图:
UIView对象的隐藏
view.hidden = NO;//YES即为隐藏视图,NO反之
view1.alpha = .5;//透明度,1为完全不透明,0为完全透明
view.opaque = NO;//设置是否显示不透明
[view1 removeFromSuperview];//
上面是四种隐藏UIView对象的方法:
hidden
:YES时即为隐藏视图,NO反之(默认为NO)。alpha
: 设置透明度,1为完全不透明,0为完全透明,半透明时会显示父类对象的底色。removeSuperview
:将自己从父类视图的管理中删除掉,也就不会显示在屏幕上
UIView的层级关系
示范程序:
@implementation ViewController
-(void) create
{
UIView* view = [[UIView alloc] init];
view.frame = CGRectMake(100, 100, 100, 100);
view.backgroundColor = [UIColor redColor];
UIView* view1 = [[UIView alloc] init];
view1.frame = CGRectMake(125, 125, 100, 100);
view1.backgroundColor = [UIColor greenColor];
UIView* view2 = [[UIView alloc] init];
view2.frame = CGRectMake(150, 150, 100, 100);
view2.backgroundColor = [UIColor blueColor];
//谁先被添加谁先绘制
[self.view addSubview:view];
[self.view addSubview:view1];
[self.view addSubview:view2];
//将某一个视图调整到最前面来
[self.view bringSubviewToFront:view];
//把某一个调整到最后
[self.view sendSubviewToBack:view];
//subviews是管理self.view的子视图的数组
UIView* viewfront = self.view.subviews[2];
UIView* viewback = self.view.subviews[0];
if(viewfront == view2) {
NSLog(@"相等");
}
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self create];
}
- 当层级重叠时,谁先被添加就先绘制谁
bringSubviewToFront
:把某个层级移动最上层。sendSubviewToBack
把某个层级移到最下层。subviews
管理self.view的子视图的数组。
运行结果:
UIWindow
注意:
老版本UIWindow的代码是写在“AppDelegate.m”中的。但是现在都不在这里写了,现在写到SceneDelegate.m里面,而且UIWindow对象不需要你手动创建了。
一个UIWindow对象为应用程序的用户界面提供了背景以及重要的事件处理行为。
UIWindow继承自UIView,每一个view,想要出现在屏幕上都依赖于window,但是程序中的window之间是相互独立的。应用程序收到事件之后会先转发给适当的window对象,从而又将事件转发给view对象。
具体来说,UIWindow有以下几个主要功能:
- 视图层次结构视图:
UIWindow是应用程序的层次结构视图,其整体视图是附属于UIWindow子视图。
当应用程序启动时,系统会自动创建一个UIWindow实例并将其设置为应用程序的主窗口。 - 接收和分发事件:
UIWindow负责接收来自用户的输入事件,例如触摸事件、按键事件等。
UIWindow会根据视图层次结构将这些事件分配给合适的视图进行处理。 - 管理视图控制器:
UIWindow可以持有一个根基健全的模型,特别是一个UIViewController实例。 - 多窗口支持:
特定特殊场景下,例如iPad的分屏,应用程序可以创建多个UIWindow实例。
每个UIWindow都有自己的视点层次结构,相互独立。 - 状态栏管理:
UIWindow负责管理应用程序的状态栏,例如电池电量、网络信号等图标的显示。
示例代码:
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
//创建一个视图跟踪器作为UIWindow的根视控制器
self.window.rootViewController = [[UIViewController alloc] init];
//设置window的颜色
self.window.backgroundColor = [UIColor blueColor];
//将window有效的显示在屏幕上
[self.window makeKeyAndVisible];
//直接给UIWindow上添加视图
UIView* view = [[UIView alloc] initWithFrame:CGRectMake(100, 200, 50, 50)];
view.backgroundColor = [UIColor greenColor];
UIView* backview = [[UIView alloc] initWithFrame:CGRectMake(50, 200, 300, 300)];
backview.backgroundColor = [UIColor redColor];
[self.window addSubview:backview];
//子视图的坐标会随着父视图的坐标改变而改变
[backview addSubview:view];
//打印不同对象的window属性,可以看出他们是同一个window
NSLog(@"%@", view.window);
NSLog(@"%@", backview.window);
NSLog(@"%@", self.window);
}
打印结果:
效果图:
UIViewController
UIViewController是一个视图控制器,在整个UIKit中只有一个根视图控制器,属于window的属性。视图控制器用来管理界面和处理界面的逻辑类对象,程序启动前必须对根视图控制器赋值。
先新建一个View02类
#import "View02.h"
@interface View02 ()
@end
@implementation View02
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//给视图控制器设置背景颜色
self.view.backgroundColor = [UIColor greenColor];
}
- (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
#import "ViewController.h"
#import "View02.h"
@interface ViewController ()
@end
@implementation ViewController
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//创建视图控制器二
View02* vc= [[View02 alloc] init];
//显示一个新的视图控制器界面到屏幕上来
//第一个参数:新的视图控制器
//第二个参数:是否是用动画切换效果
//第三个参数:切换后是否使用block块,不使用为nil
[self presentViewController:vc animated:YES completion:nil];
}
//当视图控制器第一次被加载视图时,调用此函数。
//当布局初始化视图来使用。
- (void)viewDidLoad {
//默认情况下调用父类的加载视图函数
[super viewDidLoad];
// Do any additional setup after loading the view.
UIView* view = [[UIView alloc] init];
view.backgroundColor = [UIColor greenColor];
view.frame = CGRectMake(100, 100, 100, 200);
self.view.backgroundColor = [UIColor redColor];
[self.view addSubview:view];
}
//视图即将显示,调用此函数
//参数:表示是否用动画切换后消失
//当前的状态:视图还没有显示
-(void) viewWillAppear:(BOOL)animated
{
NSLog(@"即将显示");
}
//视图即将消失,调用此函数
//参数:表示是否用动画切换后消失
//当前的状态:视图还是在屏幕上
-(void) viewWillDisappear:(BOOL)animated
{
NSLog(@"即将消失");
}
-(void) viewDidAppear:(BOOL)animated
{
NSLog(@"已经显示");
}
-(void) viewDidDisappear:(BOOL)animated
{
NSLog(@"已经消失");
}
@end
效果图:
点击后效果图:
定时器与视图对象
定时器对象:
- 可以在每个固定时间发送一个消息
- 通过此函数可在固定时间段来完成一个根据时间间隔的任务
- 通过此消息来调用相应的时间函数
接口部分:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
//定义一个定时器对象
//可以在每个固定时间发送一个消息
//通过此消息来调用相应的时间函数
//通过此函数可在固定时间段来完成一个根据时间间隔的任务
NSTimer* _timerView;
}
@property (retain, nonatomic) NSTimer* timerView;
@end
实现部分:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
//属性和成员变量的同步
@synthesize timerView = _timerView;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//启动定时器按钮
UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(100, 100, 80, 40);
[btn setTitle:@"启动定时器" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(pressStart) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
//停止定时器按钮
UIButton* btnstop = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnstop.frame = CGRectMake(100, 200, 80, 40);
[btnstop setTitle:@"停止定时器" forState:UIControlStateNormal];
[btnstop addTarget:self action:@selector(pressStop) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnstop];
UIView* view = [[UIView alloc] init];
view.backgroundColor = [UIColor greenColor];
view.frame = CGRectMake(0, 0, 80, 80);
[self.view addSubview:view];
//设置view的标签值
//通过父亲视图对象以及view的标签值可以获得相应的视图对象
view.tag = 111;
}
-(void) pressStart
{
//NSTtimer类方法创建一个定时器并且启动这个定时器
//P1:每隔多久调用定时器函数,以秒数为单位的整数(调用第三个参数)
//P2:表示实现定时器函数的对象指针
//P3:定时器函数对象
//P4:可以传入定时器函数中一个参数,无参数可以传nil
//P5:定时器是否重复操作;YES为重复;NO为只完成一次函数调用
//返回值为一个新建好的定时器对象
_timerView = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateTimer:) userInfo:@"美羊羊" repeats:YES];
}
//定时器函数
//可以将定时器本身做为参数传入
-(void) updateTimer:(NSTimer*) timer
{
NSLog(@"开始啦,%@", timer.userInfo);
UIView* view = [self.view viewWithTag:111];
view.frame = CGRectMake(view.frame.origin.x + 1, view.frame.origin.y + 1, 80, 80);
}
-(void) pressStop
{
if(_timerView != nil) {
[_timerView invalidate];
}
//[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(stop) userInfo:nil repeats:NO];
//NSLog(@"停止啦");
}
-(void) stop
{
NSLog(@"停止啦");
}
@end
效果图:
UISwitch
- UISwitch是一个开关控件,有开、关两种状态可以切换,是定义在UIKit库中的一个控件
- 苹果官方的控件都定义在UIKit框架中,且UIKit框架中的所有控件都以UI开头
@interface ViewController : UIViewController {
//定义一个开关控件
//可以进行状态的改变
//开:关:两种状态可以进行切换
//所有UIKit框架库中的控件均以UI开头
//苹果官方的控件都定义在UIKit框架中
UISwitch* _myswitch;
}
@property (retain, nonatomic) UISwitch* myswitch;
@end
@implementation ViewController
//同步属性和成员变量
@synthesize myswitch = _myswitch;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//创建一个开关对象
//继承与UIView
_myswitch = [[UISwitch alloc] init];
//苹果官方的控件的位置设置
//位置X,Y的值可以改变,宽度和高度无法改变
_myswitch.frame = CGRectMake(100, 200, 80, 40);
//_myswitch.backgroundColor = [UIColor blueColor];
//开关状态设置属性
//YES:开启状态;NO:关闭状态
_myswitch.on = YES;
//也可以使用set函数
//[_myswitch setOn:YES];
//设置开关状态
//P1:状态设置
//P2:是否开启动画效果
[_myswitch setOn:YES animated:YES];
[self.view addSubview:_myswitch];
//设置开启状态的风格颜色
[_myswitch setOnTintColor:[UIColor redColor] ];
//改变开关按钮的颜色
[_myswitch setThumbTintColor:[UIColor blueColor]];
//设置整体风格颜色
//[_myswitch setTintColor:[UIColor purpleColor]];
//向开关控件添加事件函数
//每次改变的时候都会调用swChange函数
[_myswitch addTarget:self action:@selector(swChange:) forControlEvents:UIControlEventValueChanged];
//self.view.backgroundColor = [UIColor blueColor];
}
-(void) swChange:(UISwitch*) sw
{
if(sw.on == YES)
NSLog(@"开关被打开");
else
NSLog(@"开关被关上");
}
@end
效果图: