UI的学习(一)

UI的学习(一)

文章目录

  • UI的学习(一)
    • UIlabel
    • UIButton
      • UIButton的两种形式
      • UIButton的事件触发
    • UIView
      • 多个视图之间的关系
    • UIWindow
    • UIViewController
      • 一个视图推出另一个视图
    • 定时器和视图移动
    • UISwitch
    • UISlider和UIProgressSlid
    • 步进器与分栏控制器
    • UITextField
    • UIScrollView
      • 有关实现它的代理函数
    • UIAlertController和UIActivityIndicatorView

UIlabel

首先在我们的创建的项目中的ViewController 在 实现部分添加创建UILabel的函数。

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

label的主要参数为:

  • text:显示的文字
  • background:label的背景颜色
  • shadowColor:字体的阴影颜色
  • shadowOffset:阴影的偏离位置
  • textAlignment:设置文字的位置
  • numberOfLine:长文字按照设计的行数来显示
  • textColor:设置文字的颜色
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
- (void) creatUI {
    UILabel *label = [[UILabel alloc] init];
    label.text = @"486是个好人"; //显示文字的赋值
    label.frame = CGRectMake(10, 400, 410, 200); //显示位置
    label.backgroundColor = [UIColor redColor]; //label的背景颜色
    self.view.backgroundColor = [UIColor yellowColor]; //整个屏幕的背景颜色
    [self.view addSubview: label]; //显示label
    label.font = [UIFont systemFontOfSize:34]; //label的大小和字体
    label.textColor = [UIColor blueColor]; //字体颜色
    label.shadowColor = [UIColor greenColor]; //字体阴影颜色
    label.shadowOffset = CGSizeMake(10, 10); //阴影的偏离位置
    
    label.textAlignment = NSTextAlignmentCenter; //设置居中对齐
    label.numberOfLines = 3; //文字尽量按设计的行数来显示
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self creatUI];
  	//调用和创建UI函数
    // Do any additional setup after loading the view.
}


@end

这里主要注意的是两个类型,一个是CGRectMake类型(这个结构体又包括了origin和size两个成员变量),origin表示的是一个label的起始点,size表示的是一个显示出来的矩阵的宽和高,我们的坐标系是以屏幕左上角为基准点,向下为y,向右为x。

在这里插入图片描述

UIButton

UIButton是UIKit框架中的一个类,它是继承自UIView的子类,用于创建可点击的按钮控件。UIButton通常用于响应用户的触摸事件,并执行相应的操作或触发特定的动作。主要分成UIButton的类型和事件触发两个方面来展开。

UIButton的两种形式

UIButton的主要参数为

  • frame:大小
  • backgroundColor:背景颜色

这里还要注意一个点就是我们的button有两个状态一个是正常状态一个是高亮状态,可以根据不同的状态给用户一个反馈。

普通的按钮

- (void)creatUIRectButton { //创建普通的UIButton
    UIButton *btn = [UIButton buttonWithType: UIButtonTypeRoundedRect];//根据类型来创建
    btn.frame = CGRectMake(10, 100, 150, 80);//一个矩型设置的一个位置
    [btn setTitle:@"button1" forState: UIControlStateNormal]; //一个是按钮的位置,一个是按钮文字的现显示的状态
    [btn setTitle:@"fitst button1" forState: UIControlStateHighlighted];
    btn.backgroundColor = [UIColor grayColor]; // 设置背景颜色
    [btn setTitleColor:[UIColor redColor] forState: UIControlStateNormal]; //设置字面的颜色未按下的时候
    [btn setTitleColor:[UIColor greenColor] forState: UIControlStateHighlighted];//设置字面按下时候的颜色
    [btn setTintColor: [UIColor whiteColor]];//同一设置颜色,优先级在前两个函数的后面
    btn.titleLabel.font = [UIFont systemFontOfSize:18];//设置字体大小
    [self.view addSubview: btn]; //添加到视图中显示
}

这是这个按钮的显示效果

在这里插入图片描述

图片按钮

- (void) creatImageButton {
    UIButton* btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.frame = CGRectMake(10, 300, 150, 100);
    UIImage* icon1 = [UIImage imageNamed:@"btn02.jpeg"];//设置路径
    UIImage* icon2 = [UIImage imageNamed:@"btn03.jpg"];
    [btn setImage:icon1 forState:UIControlStateNormal];
    [btn setImage:icon2 forState:UIControlStateHighlighted];
    [self.view addSubview:btn];
}

实现效果:

在这里插入图片描述

UIButton的事件触发

我们这里考虑用addTarget来给我们的一个UIButton来添加点击事件,在通过我们编写的一个函数通过判断按钮不同的一个tag值来执行不同的操作

tips:这里我们的tag从100开始,这样方便自己去记录。

- (void)creatUIRectButton { //创建普通的UIButton
    UIButton *btn = [UIButton buttonWithType: UIButtonTypeRoundedRect];//根据类型来创建
    UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn1.frame = CGRectMake(10, 400, 120, 80);
    [btn1 setTitle:@"test button" forState:UIControlStateNormal];
    [btn1 setTitle:@"按下时候" forState:UIControlStateHighlighted];
    [btn1 addTarget:self action:@selector(press:) forControlEvents:UIControlEventTouchUpInside];//手指离开时在按钮范围内
    [btn1 setTintColor:[UIColor whiteColor]];
    btn1.backgroundColor = [UIColor grayColor];
    
    btn.frame = CGRectMake(10, 100, 150, 80);//一个矩型设置的一个位置
    [btn setTitle:@"button1" forState: UIControlStateNormal]; //一个是按钮的位置,一个是按钮文字的现显示的状态
    [btn setTitle:@"fitst button1" forState: UIControlStateHighlighted];
    btn.backgroundColor = [UIColor grayColor];
    [btn setTitleColor:[UIColor redColor] forState: UIControlStateNormal];
    [btn setTitleColor:[UIColor greenColor] forState: UIControlStateHighlighted];
    [btn setTintColor: [UIColor whiteColor]];
    btn.titleLabel.font = [UIFont systemFontOfSize:18];
    [btn addTarget:self action:@selector(press:) forControlEvents:UIControlEventTouchUpInside];
    btn.tag = 101;//添加号码用于判断
    btn1.tag = 102;
    [self.view addSubview: btn1];
    [self.view addSubview: btn]; //添加到视图中显示
}
- (void) press:(UIButton*) btn {
    if (btn.tag == 102) {
        NSLog(@"btn 被按下");
    }
    if (btn.tag == 101) {
        NSLog(@"btn1被按下");
    }
}

实现效果:

在这里插入图片描述

每一次按下我们的控制台会打印:

在这里插入图片描述

UIView

视图对象是显示在我们屏幕上的所有对象的基类,也就是我们上面的一个UIButton和UIlabel的基类。

基本属性:

  • background:背景颜色
  • frame:大小
  • alpha:透明度。1为不透明,0为透明
//所有看到的对象全部都是UIView的子类
- (void)viewDidLoad {
    [super viewDidLoad];
    UIView* view = [[UIView alloc] init];
    //设置一个位置
    view.frame = CGRectMake(10, 100, 230, 70);
    view.backgroundColor = [UIColor blueColor];
    self.view.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:view];//父视图添加子视图
    //view.hidden = YES为不显示
    //view.alpha = 0.6;
    view.opaque = YES;//是否显示不透明
    //1不透明
    //0透明
     //将新建的视图显示到屏幕上
    //子视图会受到父视图的管理
    //[self creatUIRectButton];
    //[self creatImageButton];
    // Do any additional setup after loading the view.
}


@end

显示效果:

在这里插入图片描述

多个视图之间的关系

在多个视图同时被添加到我们的父亲视图上的时候,会出现一个先后添加的问题,这时候我们就要理解它先后添加带来的视觉效果,这里我们通过三个视图的添加到同一个父视图上来展现一个它的效果。

- (void)viewDidLoad {
    [super viewDidLoad];
    UIView* view = [[UIView alloc] init];
    //设置一个位置
    view.frame = CGRectMake(100, 100, 150, 150);
    view.backgroundColor = [UIColor blueColor];
    [self.view addSubview:view];//父视图添加子视图
    
    UIView* view1 = [[UIView alloc] init];
    //设置一个位置
    view1.frame = CGRectMake(125, 125, 150, 150);
    view1.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:view1];//父视图添加子视图
    
    UIView* view2 = [[UIView alloc] init];
    //设置一个位置
    view2.frame = CGRectMake(150, 150, 150, 150);
    view2.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:view2];//父视图添加子视图
    //[self.view bringSubviewToFront:view];//将视图跳涨到最前面
    //[self.view sendSubviewToBack:view2];//调整到最后面
    UIView* viewfront = self.view.subviews[0];
    if (viewfront == view) {
        NSLog(@"dddd");
    }
}


@end

在这里插入图片描述

这里可以看到我们的第三个视图会覆盖第二个视图,第二个视图会覆盖第一个视图,所以我们可以简单理解成一个后面的视图会覆盖前面的视图。

控制台的输出:

在这里插入图片描述

这就说明了一个点就是,我们的添加视图到自己的subview中间的顺序是后添加的视图插入到后面部分。

UIWindow

这里引用一段chatgpt的内容来介绍我的UIWindow,我们主要通过一个根视图控制器来展示出我们不同的一个

UIWindow 是应用程序中最顶层的视图容器,所有其他的视图控件都是建立在 UIWindow 之上的。它为应用程序的视图层次结构提供了一个容器和根视图。

在现在这个版本中我们已经不需要创建UIWindow了,程序自己会创建,我们只用创建一个根视图控制器来决定我们要推出那一个视图控制器展示在用户眼前。

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    //UIWindow继承于UIView,它是一个特殊的UIView
    //UIScreen:屏幕硬件表示类
    //mainScreen表示主屏幕的设备信息
    //bounds表示屏幕的宽高值
    self.window.rootViewController = [[UIViewController alloc] init];//创建根视图控制器
    self.window.backgroundColor = [UIColor blueColor];
    UIView* view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 150, 150)];
    view.backgroundColor = [UIColor orangeColor];
    UIView* backview = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 240, 360)];
    backview.backgroundColor = [UIColor redColor];
    //子视图的坐标是参照父亲视图的坐标系
    //当父亲视图移动的时候,所有的子视图都会移动
    
    [backview addSubview: view];
    [self.window addSubview: backview];
    
    [self.window makeKeyAndVisible]; //显示我们的根视图
    NSLog(@"%@\n, %@\n, %@\n", view.window, backview.window, self.window);
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
}


- (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的两个文件

但是我们也仅仅只是知道我们在UIViewController文件中viewDidLoad函数会被调用,并不清楚它中间的调用关系。下面来介绍一下它的一个调用关系:

AppDelegate.m → SceneDelegate.m → ViewController.m

self.window.rootViewController = [[UIViewController alloc] init];//创建根视图控制器
//这里把根视图控制器设置成我的UIViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

上面就是有关与他的一个调用过程

一个视图推出另一个视图

接下来我们来尝试一下如何推出另一个视图

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor orangeColor];
    // Do any additional setup after loading the view.
}
- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {//我们触碰空白处会执行事件的一个函数
    //使当前的控制器消失掉
    //P1:新的视图对象
    //P2:使用动画切换效果
    //P3:切换结束后功能调用,不需要就传入一个nil。
    [self dismissViewControllerAnimated:YES completion: nil];//消失这个view
}

这时候我们在根视图控制器中推出我们的另一个view。

- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    View02* vc = [[View02 alloc] init];
    [self presentViewController:vc animated:YES completion: nil];//这里推出我们的view页面。
}

实现的效果:

在这里插入图片描述

点击后:

在这里插入图片描述

定时器和视图移动

这里讲一下我们的定时器和视图移动的内容

先讲一下有关设置定时器的内容:

  • _timerView = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateTimer:) userInfo:@"xiaoming" repeats:YES];这里一共有5个参数他分别表达的内容是
  • P1:每隔多长时间调用一下定时器函数,以秒为单位
  • P2:表示定时器函数的对象
  • P3:定时器函数对象
  • P4:可以定时器函数中的一个参数,无参数可以传入nil
  • P5:定时器是否重复操作,YES为重复

这里是代码内容

@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:@"timer to begin" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(pressStart) forControlEvents:UIControlEventTouchUpInside];
    btn.backgroundColor = [UIColor greenColor];
    
    UIButton* btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn1.frame = CGRectMake(100, 200, 80, 40);
    [btn1 setTitle:@"timer to stop" forState:UIControlStateNormal];
    [btn1 addTarget:self action:@selector(pressStop:) forControlEvents:UIControlEventTouchUpInside];
    btn1.backgroundColor = [UIColor greenColor];
    [self.view addSubview:btn];
    [self.view addSubview:btn1];
    
    UIView* view = [[UIView alloc] init];
    view.frame = CGRectMake(0, 0, 80, 80);
    view.backgroundColor = [UIColor blueColor];
    [self.view addSubview:view];
    view.tag = 101;//设置一个标签
}
- (void) pressStart {
    if (_timerView == nil) { //这个部分是为了防止重复创建
      //P1:每隔多长时间调用一下定时器函数,以秒为单位
    //P2:表示定时器函数的对象
    //P3:定时器函数对象
    //P4:可以定时器函数中的一个参数,无参数可以传入nil
    //P5:定时器是否重复操作,YES为重复
    //返回值为一个新建好的定时器对象
        _timerView = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateTimer:) userInfo:@"xiaoming" repeats:YES];
    } else {
        [_timerView setFireDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; //定时器在这之后的0.1秒时候调用
    }
    
}
- (void) updateTimer:(NSTimer*) timer {
    NSLog(@"name == %@", timer.userInfo);
    UIView* view = [self.view viewWithTag:101];
    view.frame = CGRectMake(view.frame.origin.x + 1, view.frame.origin.y + 1, 80, 80);
}
- (void) pressStop:(id)sender{
    
    if (_timerView != nil) {
        [_timerView invalidate];//让定时器失效
        _timerView = nil;
    }
}

@end

这里笔者出现了一个问题:就是按下两次我们的按钮后,我们的视图无法停止的问题,后面修改定时器部分的代码为这个情况后解决了这个问题:

- (void) pressStart {
    if (_timerView == nil) { //这个部分是为了防止重复创建,导致无法停下的问题
        _timerView = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateTimer:) userInfo:@"xiaoming" repeats:YES];
    } else {
        [_timerView setFireDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; //定时器在这之后的0.1秒时候调用
    }
    
}

实现的效果为点下按钮后视图开始移动,按下停止后视图停止移动:

在这里插入图片描述

UISwitch

这是我们苹果官方定义的一个控件,他的主要属性是

  • frame:但是他仅仅只能修改位置,不能修改长度和宽度
@interface ViewController : UIViewController {
    UISwitch* _mySwitch;
    //定义开关控件
    //开:关两种状态可以用来切换
    //所有的UIkit框架中的控件均以UI开头
    //苹果官方的控件都定义在UIKit
}
@property(strong, nonatomic) UISwitch* mySwtich;

@end
 #import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize mySwtich = _mySwtich;
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    _mySwitch = [[UISwitch alloc] init];
    _mySwitch.frame = CGRectMake(100, 100, 80, 40);//开关长度和宽度无法修改,只能修改位置
    _mySwitch.on = YES;
    //[_mySwitch setOn:YES animated:YES];
    //p2:是否开启动画
    [self.view addSubview: _mySwitch];
    [_mySwitch setOnTintColor:[UIColor redColor]];//修改颜色
    [_mySwitch setThumbTintColor:[UIColor greenColor]];//修改圆形按钮颜色
    [_mySwitch setTintColor:[UIColor purpleColor]];
    [_mySwitch addTarget:self action:@selector(swChange:) forControlEvents:UIControlEventValueChanged];
    //开关状态发生变化,重要的是第三个参数是指这个控件状态变化的情况他发生改变
}

- (void) swChange:(UISwitch*) sw {
    //ON表示当前结束的状态
    if (sw.on == YES) {
        NSLog(@"开关打开");
    } else {
        NSLog(@"开关关闭");
    }
}
@end

实现的效果为:

在这里插入图片描述

UISlider和UIProgressSlid

UISlider 是一种常用的用于控制数值大小的 UI 控件。UIProgressView 是一种用于显示进度的 UI 控件。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize mySwtich = _mySwtich;
@synthesize progressView = _progressView;
@synthesize slider = _slider;
- (void)viewDidLoad {
    [super viewDidLoad];
    _progressView = [[UIProgressView alloc] init];
    _progressView.frame = CGRectMake(50, 100, 200, 40);//位置可变化,高度不可以变化
    _progressView.progressTintColor = [UIColor redColor];
    _progressView.progressViewStyle = UIProgressViewStyleDefault;
    _progressView.progress = 0.7;//设置进度条的进度值
    [self.view addSubview:_progressView];
    _progressView.trackTintColor = [UIColor blackColor];
    _slider = [[UISlider alloc] init];
    _slider.frame = CGRectMake(10, 200, 300, 40);
    _slider.maximumValue = 100;
    _slider.minimumValue = -100;
    _slider.value = -100;
    _slider.minimumTrackTintColor = [UIColor blueColor];
    _slider.maximumTrackTintColor = [UIColor greenColor];
    _slider.thumbTintColor = [UIColor orangeColor];
    [_slider addTarget:self action:@selector(pressSlider:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:_slider];
}
- (void) pressSlider:(UISlider*) slider {
    _progressView.progress = (_slider.value - _slider.minimumValue) / (_slider.maximumValue - _slider.minimumValue);
    NSLog(@"value = %lf", slider.value);
}


@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(100, 100, 80, 32321);
    _stepper.minimumValue = 0;
    _stepper.maximumValue = 100;
    _stepper.autorepeat = YES;
    //是否可以重复响应事件操作
    //在前者为正确的情况下,将步进结果通过事件函数来打印。
    _stepper.continuous = NO;
    _stepper.value = 10;
    [_stepper addTarget:self action:@selector(stepChange) forControlEvents:UIControlEventValueChanged];
    _stepper.stepValue = 5;
    [self.view addSubview:_stepper];
    
    //分栏控件
    _segControl = [[UISegmentedControl alloc] init];
    _segControl.frame = CGRectMake(10, 200, 300, 40);//宽度可变
    [_segControl insertSegmentWithTitle:@"dd" atIndex:0 animated:NO];
    [_segControl insertSegmentWithTitle:@"cc" atIndex:1 animated:NO];
    [_segControl insertSegmentWithTitle:@"bb" atIndex:2 animated:NO];
    _segControl.selectedSegmentIndex = 0;
    [_segControl addTarget:self action:@selector(segChange) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview: _segControl];
    // Do any additional setup after loading the view.
}
-(void) segChange {
    NSLog(@"%lu", _segControl.selectedSegmentIndex);
}
-(void) stepChange {
    NSLog(@"step press ! value = %lf", _stepper.value);
}

@end

在这里插入图片描述

UITextField

UITextField是iOS开发中常用的控件之一,用于在应用程序中接收用户的文本输入。UITextField可以放置在视图层次结构中的任何位置,并通过键盘输入文本。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize textField = _textField;
- (void)viewDidLoad {
    [super viewDidLoad];
    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 blackColor];
    self.textField.borderStyle = UITextBorderStyleRoundedRect;//设置圆角风格
    //self.textField.borderStyle = UITextBorderStyleLine; // 线框风格
    self.textField.keyboardType = UIKeyboardTypeNumberPad;
    //设置虚拟键盘风格
    //UIKeyboardTypeDefault默认风格
    //UIKeyboardTyprNamePhonePad字母和数字的组合风格
    //UIKeyboradTypeNumberPad:纯数字风格
    self.textField.placeholder = @"请输入用户名";
    //提示文字
    self.textField.secureTextEntry = NO;
    //是否为密码输入
    //YES:作为密码处理,原点加密
    //NO:正常显示
    [self.view addSubview:self.textField];
    self.textField.delegate = self;
    // Do any additional setup after loading the view.
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self.textField resignFirstResponder];//让虚拟键盘回收,不再作为第一消息响应者
}
-(void)textFieldDidBeginEditing:(UITextField *)textField {
    NSLog(@"开始编辑了");
}
-(void) textFieldDidEndEditing:(UITextField *)textField {
    self.textField.text = @"";
    NSLog(@"开始结束编辑了");
}
//是否可以进行输入
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    return YES;
}
//是否可以结束输入
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    if (self.textField.text.length < 8) {
        return NO;
    } else {
        return YES;
    }
    
}
@end

在这里插入图片描述

UIScrollView

UIScrollView是一个强大的视图容器,我们可以通过这个视图容器实现一个滑动的效果,他主要有以下几个属性

  • frame:指定滚动视图的大小(也就是可以滚动视图显示的那一部分内容)
  • contentSize:设置的是滚动视图内容的大小,也就是一个画布的大小
  • contentOffset:设置的是滚动视图的内容的偏移量,CGPoint类型的变量
  • bounces:是否有弹簧效果
  • pagingEnable:是否按照整页滚动
  • scrollEnale:是否开启滚动效果
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //定义一个滚动视图
    UIScrollView* sv = [[UIScrollView alloc] init];
    CGRect screenBounds = [[UIScreen mainScreen] bounds];
    sv.frame = screenBounds;
    //是否按照整页滚动
    sv.pagingEnabled = YES;
    //是否可以开启滚动效果
    sv.scrollEnabled = YES;
    //设置画布的大小,画布显示在滚动视图内部,一般大于frame的大小
    sv.contentSize = CGSizeMake(screenBounds.size.width * 5, screenBounds.size.height);
    //设置边缘弹动
    sv.bounces = YES;
    //开启横向弹动
    sv.alwaysBounceHorizontal = YES;
    //开启纵向弹动
    sv.alwaysBounceVertical = YES;
    //是否显示横向滚动条
    sv.showsHorizontalScrollIndicator = YES;
    //是否显示纵向滚动条
    sv.showsVerticalScrollIndicator = YES;
    //设置背景颜色
    sv.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:sv];
    for (int i = 1; i <= 5; i++) {
        NSString* strName = [NSString stringWithFormat:@"%d.jpg", i];
        UIImage* image  = [UIImage imageNamed:strName];
        UIImageView* iView = [[UIImageView alloc] initWithImage:image];
        iView.frame = CGRectMake(screenBounds.size.width * (i - 1), 0, screenBounds.size.width, screenBounds.size.height);
        [sv addSubview:iView];
    }
    [self.view addSubview:sv];
    // Do any additional setup after loading the view.
}


@end

实现的一个效果:

在这里插入图片描述

有关实现它的代理函数

这里我们主要是可以通过下面的协议函数,可以通过协议函数来获取我们的一个当前位置

  • -(void) scrollViewDidScroll:(UIScrollView *)scrollView

同时可以明白一个拖动这一个动作是由几个步骤组成的。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _scrolView = [[UIScrollView alloc] init];
    CGRect screenBounds = [[UIScreen mainScreen] bounds];
    _scrolView.frame = CGRectMake(0, 0, screenBounds.size.width, screenBounds.size.height*0.75);
    _scrolView.bounces = NO;
    //_scrolView.userInteractionEnabled = NO;
    //是否接受触碰事件,yes接受,no不接受
    _scrolView.contentSize = CGSizeMake(screenBounds.size.width, screenBounds.size.height * 9 * 0.75);
    for (int i = 0; i < 9; i++) {
        NSString* str = [NSString stringWithFormat:@"%d.jpg", i + 1];
        UIImage* image = [UIImage imageNamed:str];
        UIImageView* iView = [[UIImageView alloc] initWithImage:image];
        iView.frame = CGRectMake(0, screenBounds.size.height * i * 0.75, screenBounds.size.width, screenBounds.size.height * 0.75);
        [_scrolView addSubview:iView];
    }
    [self.view addSubview:_scrolView];
    _scrolView.contentOffset = CGPointMake(0, 0);
    _scrolView.pagingEnabled = NO;
    _scrolView.delegate = self;
    //当前视图控制器作为代理对象
    // Do any additional setup after loading the view.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    CGRect screenBounds = [[UIScreen mainScreen] bounds];
    [_scrolView scrollRectToVisible:CGRectMake(0, 0, screenBounds.size.width, screenBounds.size.height * 0.75) animated:YES];
}
//当视图移动时,都会调用这个函数
//调用这个协议的滚动视图对象
//使用这个函数来监控滚动视图的位置
-(void) scrollViewDidScroll:(UIScrollView *)scrollView {
    NSLog(@"y = %lf", scrollView.contentOffset.y);
}
//结束拖动的时候调用这个函数
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
    NSLog(@"结束拖动的时候调用这个函数");
}
//滚动视图即将开始被拖动的时候
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    NSLog(@"滚动视图即将开始被拖动的时候");
}
//即将结束拖动的时候调用
-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    NSLog(@"即将结束拖动的时候调用");
}
//视图即将减速的时候
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
    NSLog(@"视图即将减速的时候");
}
//视图即将结束减速的时候调用,视图停止的瞬间调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    NSLog(@"视图即将结束减速的时候调用");
}
@end

实现效果:

在这里插入图片描述

我们进行一次拖动后打印台的结果:

在这里插入图片描述

这就展示了一个我们拖动后的一个变化的顺序:

先开始拖动,拖动后会开始进行一个减速,直到减速停止,一共这几个步骤。

UIAlertController和UIActivityIndicatorView

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize activi = _activi;
@synthesize alertController = _alertController;
- (void)viewDidLoad {
    [super viewDidLoad];
    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(press:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview: btn];
    }
    
    // Do any additional setup after loading the view.
}
- (void) press:(UIButton*) btn {
    if (btn.tag == 101) {
        _alertController = [UIAlertController alertControllerWithTitle:@"警告" message:@"手机电量过低" preferredStyle:UIAlertControllerStyleAlert];
        // 添加一个"取消"按钮
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消"
                                                              style:UIAlertActionStyleCancel
                                                            handler:nil];
        [_alertController addAction:cancelAction];
        UIAlertAction *newAction = [UIAlertAction actionWithTitle:@"新的"
                                                              style:UIAlertActionStyleDefault
                                                            handler:nil];
        [_alertController addAction:newAction];
        // 添加一个"确认"按钮
        UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"确认"
                                                               style:UIAlertActionStyleDefault
                                                             handler:^(UIAlertAction * _Nonnull action) {
            NSLog(@"点击了确认按钮");
                                                             }];
        [_alertController addAction:confirmAction];
        [self presentViewController: _alertController animated:YES completion:nil];
        
    } else if (btn.tag == 102) {
        _activi = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(100, 300, 80, 80)];
        _activi.activityIndicatorViewStyle = UIActivityIndicatorViewStyleMedium;
        [self.view addSubview:_activi];
        [_activi startAnimating];
        //[_activi stopAnimating];
    }
}
@end

我们现在的警告弹窗都是通过UIAlertController去实现的,我们是通过给这个控制器添加UIAlertAction去实现的,UIAlertAction相当于一个按钮,我们设置这种按钮主要通过actionWithTitle: style: handler:这个方法来添加文本,风格,执行的函数来实现的一个按钮,两个按钮的话会是左右对称,三个按钮则是竖向排列。

实现效果:

在这里插入图片描述

另一个则是一个等待提示器:

在这里插入图片描述

在iOS13之后设定等待提示器的风格只有UIActivityIndicatorViewStyleLarge和UIActivityIndicatorViewStyleMedium两种风格**,**舍弃了原来小白、小灰、大白三种风格。

以上就是对于UI学习的一个简单的总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/671161.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python打包成exe】

Python打包成exe 前言一、理论知识打底二、实操开始----pyinstaller【Base环境下】【这是一个失败案例】规规矩矩 总结 前言 先放点参考 这个字多&#xff0c;写得很详细⇨用 Pyinstaller 模块将 Python 程序打包成 exe 文件&#xff08;全网最全面最详细&#xff0c;万字详述…

C语言王国——内存函数

目录 1 memcpy函数 1.1 函数表达式 1.2 函数模拟 2 memmove函数 2.1 函数的表达式 2.2 函数模拟 3 memset函数 3.1 函数的表达式 3.2 函数的运用 4 memcmp函数 4.1函数的表达式&#xff1a; 4.2 函数的运用 5 结论 接上回我们讲了C语言的字符和字符串函数&#…

UI案例——登陆系统

UI的登陆界面实例 在学习了UILabel&#xff0c;UIButton&#xff0c;UIView&#xff0c;UITextField的内容之后&#xff0c;我们就可以写一个简单的登陆界面 我们可以通过UILabel来编写我们显示在登陆界面上的文字比方说下面这两行字就是通过UILabel去实现的。 下面给出一下实现…

6.2 休息日 背包问题总结

就目前所遇到的01背包与完全背包作总结。 01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 二维dp数组01背包 动规五部曲 1.确定…

【Linux】System V 信号量

一、信号量的概念理论渗透 1.1 基本概念 共享资源&#xff1a;多个执行流&#xff0c;可以看到的一份资源临界资源&#xff1a;被保护起来的资源 —— 保护的方式&#xff1a;同步和互斥互斥&#xff1a;任何时候只能有一个进程在访问共享资源资源&#xff0c;一定要被程序员…

LeetCode刷题之HOT100之搜索旋转排序数组

2024/6/2 雨一直下&#xff0c;一个上午都在床上趴着看完了《百年孤独》&#xff0c;撑伞去吃了个饭&#xff0c;又回到了宿舍。打开许久未开的老电脑&#xff0c;准备做题了。《百年孤独》讲了什么&#xff0c;想表达什么&#xff0c;想给读者留下什么&#xff0c;我不知道&am…

每日一题《leetcode-- LCR 025.两数相加||》

https://leetcode.cn/problems/lMSNwu/ 分别把给定的两个链表翻转&#xff0c;然后从头开始相加。 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ //反转链表 struct ListNode* reverselist(struct ListNode*h…

项目中统一异常处理

项目中统一异常处理 1.异常处理框架图2.实现 1.异常处理框架图 异常处理除了输出在日志中&#xff0c;还需要提示给用户&#xff0c;前端和后端需要作一些约定&#xff1a; 错误提示信息统一以json格式返回给前端。以HTTP状态码决定当前是否出错&#xff0c;非200为操作异常。…

基于51单片机数控直流数控电源的设计

电源技术尤其是数控电源技术是一门实践性很强的工程技术,服务于各行各业。当今电源技术融合了电气、电子、系统集成、控制理论、材料等诸多学科领域。直流稳压电源是电子技术常用的仪器设备之一,广泛的应用于教学、科研等领域,是电子实验员、电子设计人员及电路开发部门进行…

Win10 Edge提示兼容性问题打不开|解决浏览器兼容性问题

Edge有时候会与某些安全软件不兼容&#xff0c;导致报错 报错代码&#xff1a;STATUS_INVALID_IMAGE_HASH 解决Edge浏览器兼容性问题方法/步骤&#xff1a; 1、按 Win R 组合键&#xff0c;打开运行&#xff0c;并输入 regedit 命令&#xff0c;确定或回车&#xff0c;可以…

大语言模型实战——最小化模型评测

1. 引言 现在国内外的主流模型&#xff0c;在新模型发布时都会给出很多评测数据&#xff0c;用以说明当前模型在不同数据集上的测评表现&#xff08;如下面llama3发布的评测数据&#xff09;。 这些评测数据是如何给出来的呢&#xff1f;这篇文章会用一个最小化的流程来还原下…

【Android】手动下载gradle插件包,解决gradle插件包下载不全问题。

问题描述 拉取别人的项目时&#xff0c;因为网络问题gradle插件包一直下载不全&#xff0c;一直build。 解决方案&#xff1a; 打开gradle>wrapper文件下gradle-wrapper.properties&#xff0c;查看需要下载gradle-7.2-bin.zip。 distributionBaseGRADLE_USER_HOME distr…

kafka 发送文件二进制流及使用header发送附属信息

文章目录 背景案例发送方接收方 背景 需要使用kafka发送文件二进制以及附属信息 案例 发送方 import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord;import java.io.InputStream; import java.nio.charset.S…

Part 4.1 线性动态规划

线性动态规划&#xff0c;即具有线性阶段划分的动态规划。 [USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右…

统计信号处理基础 习题解答10-6

题目 在例10.1中&#xff0c;把数据模型修正为&#xff1a; 其中是WGN&#xff0c;如果&#xff0c;那么方差&#xff0c;如果&#xff0c;那么方差。求PDF 。把它与经典情况PDF 进行比较&#xff0c;在经典的情况下A是确定性的&#xff0c;是WGN&#xff0c;它的方差为&#…

数据库(17)——DCL数据控制语言

DCL DCL是Data Control Language数据控制语言&#xff0c;用来管理数据库用户、控制数据库的访问权限。 DCL-管理用户 语法 1.查询用户 USE mysql; SELECT * FROM user; 也可以直接在datagrip找到user表 我们要操作用户要通过User和Host同时定位。Host表示当前用户只能在哪个…

【深度学习实战—9】:基于MediaPipe的坐姿检测

✨博客主页&#xff1a;王乐予&#x1f388; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深度学习】【排序算法】 目录 &#x1f63a;一、Med…

前端Vue自定义滚动卡片组件设计与实现

摘要 随着技术的日新月异&#xff0c;前端开发的复杂度不断提升。传统的整块应用开发方式在面对小的改动或功能增加时&#xff0c;常常需要修改大量的整体逻辑&#xff0c;造成开发效率低下和维护成本高昂。为了应对这一挑战&#xff0c;组件化开发应运而生。本文将以Vue框架下…

Day46 动态规划part06

完全背包问题 完全背包和01背包问题唯一不同的地方就是&#xff0c;每种物品有无限件。先遍历物品还是先遍历背包以及遍历顺序 根据递推公式可知&#xff1a;每一个dp需要根据上方和左方的数据推出&#xff0c;只要保证数据左上方数据是递推出来的这种两个for循环的顺序就是可…

使用Gradio构建大模型应用:Building Generative AI Applications with Gradio

Building Generative AI Applications with Gradio 本文是学习 https://www.deeplearning.ai/short-courses/building-generative-ai-applications-with-gradio/ 这门课的学习笔记。 What you’ll learn in this course Join our new short course, Building Generative AI A…