iOS 从UIButton学习响应者链及相关技术

 

前言

hihi,勇敢的小伙伴儿们大家好,北京的疫情终于告一段落,我每次出门我都担心自己被感染,非常焦虑,我不怕自己被感染,主要是怕自己感染身边的朋友、家人,所以这种焦虑是因为“爱”~ 说出来就感觉轻松了一些。所以有些心事不能总藏在心里,要学会表达。每次都有好多话想说,但又担心不同的人听了会有不同的感受,会对我造成误解,于是渐渐地学会沉默寡言了。每次都想告诉别人我有多么多么感谢别人对我的帮助,表达我有多么多么真诚,但有时候常常苦于证明自己,而忘记了在意对方是否舒适。真想做一个自信、高情商的人,与人相处能让人“如沐春风”,可是好难呀~ 我会困惑自己是否是真的不错的一个人,会矛盾自己是否做得不妥,然后小心翼翼的表达,事后又开始无限反思我是否说了什么错话,然后感叹“我真是太不会说话了吧”,可是无论如何,我都做不到人人都喜欢。希望你们喜欢我吧~ 感谢!

每次写文章我都喜欢啰嗦一段(官方吐槽),那么言归正传,今天我们要从UIButton这样已有基础控件来“由浅入深”的学习相关的知识:响应者链,还有扩大点击范围,还有防暴力点击的内容。同时也是分享一个学习思路给大家,虽然我有些愚笨,但是你们不同,一千个读者一千个哈姆雷特,希望对你有所帮助。全文Demo地址:Demo,请结合本文看哦~

正文

1.了解UIButton

UIButton是什么?其实就是一个按钮控件,既能显示文字,又能显示图片,能通过点击来触发执行事件,就像台灯的开关,按钮执行了开灯和关灯的事件。是一种在iOS中非常常用的控件,在和用户的交互中扮演了非常重要的角色。

UIButton怎么用?欢迎移步https://developer.apple.com/documentation/uikit/uibutton进行学习。

那么问题来了,UIButton的继承关系你仔细关注过了吗?如果你没有,刚好我们一起来了解一下。

UIButton继承于UIControl,UIControl继承于UIView,UIView继承于UIResponder,UIResponder继承于NSObject。

UIKIT_EXTERN API_AVAILABLE(ios(2.0)) @interface UIButton : UIControl <NSCoding>

UIKIT_EXTERN API_AVAILABLE(ios(2.0)) @interface UIControl : UIView

UIKIT_EXTERN API_AVAILABLE(ios(2.0)) @interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusItem, UIFocusItemContainer, CALayerDelegate>

UIKIT_EXTERN API_AVAILABLE(ios(2.0)) @interface UIResponder : NSObject <UIResponderStandardEditActions>

@interface NSObject <NSObject> {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
    Class isa  OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}

你看,根据一个UIButton,我们知道了UIControl,知道了UIView,知道了UIResponder,知道了NSObject,就像是在挖地洞,随着洞越来越深,我们不断地发现未知的新世界。

2.了解UIControl

UIControl是什么?UIControl的主要角色是定义一套接口和基础实现,为iOS的人机交互制定了一系列的标准,
为了当确定的事件发生的时候(比如点击了按钮)准备好动作消息(Action)并开始派发它们到自己的目标(Target,eg:UIViewController)。UIControl是控件的基类,不能直接的实例化,它只能通过继承的方式为子类提供公共的接口和动作结构。

下图简单的列举了几个继承于UIControl的控件方便大家理解。

有的同学可能对UIStepper比较陌生,我这也是从https://developer.apple.com/documentation/uikit/uicontrol#see-also里面看到的,具体的样子就是如下图所示,它是一个可以增加或减少值的控件。

UIControl怎么用?我们今天需要特别学习它的一个重要方法是准备并发送动作消息sendAction:to:forEvent:,具体移步https://www.jianshu.com/p/bab7a7ec4b72进行学习。

3.了解UIView

UIView是什么?An object that manages the content for a rectangular area on the screen.即UIView表示屏幕上的一块矩形区域。它在App中占有绝对重要的地位,因为iOS中几乎所有可视化控件都是UIView的子类,其中大名鼎鼎的UIWindow就是继承于UIView。负责渲染区域的内容,并且响应该区域内发生的触摸事件。

其中UIView不能响应事件的三种情况是:

  • 不允许交互:userInteractionEnabled = NO
  • 隐藏:如果把父控件隐藏,那么子控件也会隐藏,隐藏的控件不能接受事件
  • 透明度:如果设置一个控件的透明度<=0.01,会直接影响子控件的透明度。alpha:0.0~0.01为透明。

UIView怎么用?1.管理矩形区域里的内容 2.处理矩形区域中的事件 3.子视图的管理 4.还能实现动画。当然,UIView的子类也具有这些功能。

UIView的基本用法我相信在座的各位小伙伴儿们应该都很熟练了,所以不赘述,这篇文章里主要学习UIView的几个方法:

//在两个view的坐标系中转换point或者rect
- (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view;
- (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;
- (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;
- (CGRect)convertRect:(CGRect)rect fromView:(nullable UIView *)view;

//view中的点击测试
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;   // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;   // default returns YES if point is in bounds

在后面的代码中你会看到它们的用法。

关于UIView我们用的比较多,了解的也比较多,比如它和CALayer的关系和区别之类的问题,可以搜索学习一下,我们今天主要学习一下UIView的父类UIResponder。

4.了解UIResponder

UIResponder是什么?Apple官方的备注是An abstract interface for responding to and handling events.翻译过来就是一个用于响应和处理事件的抽象接口。

所以不是任何对象都可以响应并处理事件的,只有继承了UIResponder的对象才能接收并处理事件,我们称为响应者对象。

不仅UIView是继承于UIResponder,我们熟知的UIViewController和UIApplication都是UIResponder的子类。另外SpriteKit中的SKNode也是继承自UIResponder类。

那么这些事件有都有什么?iOS中的事件主要有:触摸事件:点击、滑动等;运动事件:摇一摇;远程控制事件:通过耳机控制音量。

UIResponder怎么用?它可以管理响应者链,还可以管理输入视图,还可以响应触摸事件、响应移动事件、响应远程控制事件、验证命令、管理文本输入模式、支持User Activities。具体可参考

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值