iOS UIKit 的复习

简介: iOS UIKit 的复习

引言

相信老粉都知道我连续更文一个多月了,接下来就复习下UIKit 包括delegate

image.png

UIKit 框架提供了 iOS 或 Apple tvOS app 所需的基础架构。它提供了用于实施界面的窗口和视图架构,用于向 app 提供多点触控和其他类型输入的事件处理基础架构,以及管理用户、系统和 app 之间互动所需的主运行循环。

除非另有说明,否则请仅从 app 的主线程或主调度队列使用 UIKit 类。此限制尤其适用于从 UIResponder 派生而来的类,或涉及以任何方式操作 app 用户界面的类。


I UIKit 的复习

  1. UIButton->UIControl->UIView
  2. UILabel ->UIView
  3. UIImageView->UIView
  4. UITextField->UIControl->UIView

1.1 设置控件的状态

NS_CLASS_AVAILABLE_IOS(2_0) @interface UIControl : UIView
 @property(nonatomic,getter=isEnabled) BOOL enabled;//启用、禁用控件
 @property(nonatomic,getter=isSelected) BOOL selected;//选中、不选中
 @property(nonatomic,getter=isHighlighted) BOOL highlighted; //高亮、不高亮

1.2 设置控件内容的布局

@property(nonatomic) UIControlContentVerticalAlignment contentVerticalAlignment;//垂直居中方法
 @property(nonatomic) UIControlContentHorizontalAlignment contentHorizontalAlignment;//水平居中方向

1.3 添加监听方法

- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
 - (void)removeTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;

II 代理设计模式

是oc中最为广泛的一种设计模式

2.1 代理的作用是什么?

  1. 监听哪些“不能通过addTarget方式监听的“事件
  2. 主要负责在,两对象之间,发生某些事件时,数据或消息的传递工作

2.2 代理实现的步骤

  1. 成为(子)控件的代理;父亲(视图控制器)成为儿子(textField)的代理
  2. 可选步骤:遵守协议,利用ide的提示功能,快速编写代码
  3. 实现协议方法
#import "ViewController.h"
@interface ViewController ()<UITextFieldDelegate>
@end
@implementation ViewController
/**
 */
- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
    [btn setCenter:self.view.center];
    [self.view addSubview:btn];
    //将监听方法click注册到“运行循环”,当触发ControlEvent事件时,由“运行循环”通知Target(ViewController) 执行action(@selector)
    //Adds a target and action for a particular event (or events) to an internal dispatch table.将特定事件的执行目标和行动添加到内部调度表
    [btn addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
    UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 100, 80, 20)];
    [textField setText:@"lydia"];
    [textField setTextColor:[UIColor blackColor]];
    [textField setContentHorizontalAlignment:UIControlContentHorizontalAlignmentCenter];
    [textField setDelegate:self];
    [self.view addSubview:textField];
}
#pragma mark - 文本框代理
/**
 成为代理之后要做的事情是什么?以及如何工作
 1》协议:一些预先定义的没有具体的实现方法名,每个方法对应不同的事件。@protocol UITextFieldDelegate <NSObject>
 */
//Asks the delegate if the specified text should be changed.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    NSLog(@"replacementString =%@, textField = %@,NsRange = %@",string,textField.text,NSStringFromRange(range));
    //限制输入的长度
    long location = range.location;
    return location<7;//YEStrue if the specified text range should be replaced; otherwise, NOfalse to keep the old text.
}
/**
 */
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
//    NSLog(@"%s",__FUNCTION__);
    return YES;// if an editing session should be initiated
}
- (void)textFieldDidBeginEditing:(UITextField *)textField{
//    NSLog(@"%s",__FUNCTION__);
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
//    NSLog(@"%s",__FUNCTION__);
    return YES;//if editing should stop
}
- (void)textFieldDidEndEditing:(UITextField *)textField{
    NSLog(@"%s",__FUNCTION__);
}
- (BOOL)textFieldShouldClear:(UITextField *)textField{
    NSLog(@"%s",__FUNCTION__);
    return YES;//if the text field’s contents should be cleared;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    NSLog(@"%s",__FUNCTION__);
    return YES;//if the text field should implement its default behavior for the return button;
}
- (void)click:(UIButton *)button{
    NSLog(@"%s",__FUNCTION__);
    [button removeTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
}

III contentSize和contentInset的区别

contentSize 会根据ContentInset调整offset--除了赋值,还实现了其他动作

contentInset不会根据contentSize调整offset--单纯给属性赋值

setter方法的实现差别(可采用设置断点进行查看)

//  ViewController.m
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIButton *lastButton;
@end
@implementation ViewController
/**
 */
//系统加载了storyBoard之后,调用setScrollView:方法对scrollView对象进行赋值
- (void)setScrollView:(UIScrollView *)scrollView{//本方法先于viewDidLoad:执行;本方法由系统底层自动调用
    _scrollView = scrollView;//1》setter 方法的第一句,就是赋值
    //2》其他的动作
    [_scrollView setContentInset:UIEdgeInsetsMake(64, 0, 10, 0)];
    [_scrollView setContentSize:CGSizeMake(0, CGRectGetMaxY(self.lastButton.frame))];
}
/**
 视图加载完成之后执行
 */
- (void)viewDidLoad {
    [super viewDidLoad];
    //1.设置间距:只是指定内容外侧的边距,并不会根据contentSize自动调整contentOffset
//    [self.scrollView setContentInset:UIEdgeInsetsMake(64, 0, 0, 0)];
    //2.  设置滚动视图内容大小
    //1> 若有间距contentInset,根据间距自动调整contentOffset
    //2> 若无contentInset,contentOffset是(0,0)
//    [self.scrollView setContentSize:CGSizeMake(0, CGRectGetMaxY(self.lastButton.frame)+10)];//CGRectGetMaxY(self.lastButton.frame)+10) 是为了能更清楚的显示最后一个按钮
    //3.设置偏移位置
//    [self.scrollView setContentOffset:CGPointMake(0, -64)];
}
@end

IV 计时器的播放实现

https://kunnan.blog.csdn.net/article/details/119905079

4.1 将timer添加到运行循环

往运行循环添加timer的方式一

Creates and returns a new NSTimer object and schedules it on the current run loop in the default mode.

self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];

参数说明

  1. seconds:double 时间间隔
  2. target:The object to which to send the message specified by aSelector when the timer fires. 监听时钟触发的对象
  3. Selector:The message to send to target when the timer fires.调用的方法
>The selector should have the following signature: timerFireMethod:
- (void)timerFireMethod:(NSTimer *)timer
  1. userInfo:    The user info for the timer.通常为nil,可用于区分计时器

repeats:if YES, the timer will repeatedly reschedule itself until invalidated. If NO, the timer will be invalidated after it fires.是否重复

将timer添加到运行循环的方式二
#import "ViewController.h"
@interface ViewController () <UIAlertViewDelegate>
@property (weak, nonatomic) IBOutlet UILabel *counterLabel;
@property (nonatomic,strong) NSTimer *timer;
@end
@implementation ViewController
#pragma mark - 计时器的播放实现
- (IBAction)start{
    NSLog(@"%s",__FUNCTION__);
    //间隔一秒更新counterLabel的显示
    //计时器
    //将timer添加到运行循环的方式二-------------------------------------------
    self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];
    //Registers a given timer with a given input mode.NSRunLoopCommonModes (监听滚动模式)
    [[NSRunLoop  currentRunLoop] addTimer:self.timer forMode: NSRunLoopCommonModes];
}

4.2  时钟更新方法

/**
 时钟更新方法
 */
- (void) updateTimer:(NSTimer *) timer{
    //1>取出标签的数字
    int count = self.counterLabel.text.intValue;
    //若counterLabel.text.intValue =0 ,弹出一些提示信息,否则进行倒计时
    if (0 > --count) {//count-- 先赋值,再自减
        [self pause];
        [[[UIAlertView alloc]initWithTitle:@"start" message:@"In the beginning, laydia" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"done",@"kevin",nil] show];
        return;
    }
    //2》修改counterLabel的text信息
    self.counterLabel.text = [NSString stringWithFormat: @"%d",count];//--count 先自减,再赋值
}

4.3 停止时钟

一旦调用invalidate:方法,timer就失效,如果要重新启动时钟,需要重新实例化

- (IBAction)pause{
    NSLog(@"%s",__FUNCTION__);
    //停止时钟,一旦调用invalidate:方法,timer就失效,如果要重新启动时钟,需要重新实例化
    [self.timer invalidate];//唯一停止时钟的方法
}
- (IBAction)clean{
    NSLog(@"%s",__FUNCTION__);
}
#pragma mark - UIAlertViewDelegate 的协议方法
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    NSLog(@"%lu",buttonIndex);
}
- (void)alertViewCancel:(UIAlertView *)alertView{
    NSLog(@"%s",__FUNCTION__);
}
-(BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView{
    NSLog(@"%s",__FUNCTION__);
    return NO;
}
@end

see also

目录
相关文章
|
3月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
98 1
|
9月前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
380 1
|
iOS开发
iOS UIKit Dynamics Demo 学习地址列表
iOS UIKit Dynamics Demo 学习地址列表
73 0
iOS - UIKit
1、UIKit 框架基本结构 1)控件 屏幕上的所有 UI 元素都叫做控件(也有叫做视图、组件),比如按钮(UIButton)、文本(UILabel)都是控件。 为了便于开发者打造各式各样的优秀 App,UIKit 框架提供了非常多功能强大又易用的 UI 控件,但并不是每一个都很常用,有些控件可能 1 年内都用不上,有些控件天天用,比如 UIButton、UILabel、UIImageView、UITableView 等等。
1399 0
|
Web App开发 Linux iOS开发
iOS 关于 UIKit 专栏应该写在最前面的话
iOS 关于 UIKit 应该写在最前面的话 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循“署名-非商业用途-保持一致”创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。
1081 0
|
图形学 iOS开发 Windows
iOS UIKit 框架 346 篇文档分类整理 - 预告
iOS UIKit 框架 346 篇文档分类整理 - 预告 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循“署名-非商业用途-保持一致”创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。
1249 0
|
1月前
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
152 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
3月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
13天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
40 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
2月前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
150 66

热门文章

最新文章

  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 2
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 3
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 6
    iOS各个证书生成细节
  • 7
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
  • 8
    iOS:应用程序的线程安全性
  • 9
    iOS开发-UIScrollView原理
  • 10
    iOS - Swift NSPoint 位置
  • 1
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    9
  • 2
    iOS各个证书生成细节
    22
  • 3
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    118
  • 4
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    40
  • 5
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    55
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    46
  • 7
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    40
  • 8
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    152
  • 9
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    310
  • 10
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
    106