【触摸案例-事件的产生和传递 Objective-C语言】

一、事件的产生和传递

通知

1.事件的产生和传递

1)涉及到的两个方法

2)响应者链条

这个东西呢,比较绕,然后我们接下来一块儿来看一下啊,

我们把上午最后的一份代码,复制粘贴一下,改个名字,叫做“05-事件的产生和传递”,

通知

首先,我们上午说了一下,这个hit test这个方法,还有那个touchesBegan:那个方法,

1)hit test:这个方法,我们现在应该知道的,是,它是从下往上找的这么一个过程,

2)touchesBegan:是从上往下传的这么一个过程,

大家先知道这一点,

看一下我们的ppt啊,

通知

事件的产生和传递,

通知

传递啊,

通知

消息循环

通知

运行循环,

通知

拿这一幅图,就可以啊,我们这个里边儿啊,我们在点击某一个view的时候,会产生一个触摸事件,还是上午说的,系统只是知道你现在摸到屏幕了,然后,这个时候,它会产生一个触摸事件,这个触摸事件,会添加到运行循环当中,什么是运行循环,就是我们上午所说,ApplicationMain的这个死循环啊,就是这个循环,

通知

这个死循环,实际上,就是我们所说的运行循环,

当你一点击屏幕的时候,发生了一个触摸事件,触摸事件会添加到运行循环当中,它会从下往上来找,

先找Application,

通知

1)先找Application,也是一个响应者对象啊,通过hit test,先看看它,是不是合适处理这个事件,如果不是的话,如果不是的话,再往上去找,

2)然后,Application,会去找到Window,

3)Window,再去找到你的根控制器,RootViewController,

4)根控制器,再去找你的view,也就是我们所说的控制器的view,

5)控制器的view,再往上找,再找你的子控件,如果你的子控件,找到了的话,它会从上往下,再去执行touchesBegan:

hit test:是从下往上找,合适的控件,去处理,这么一个过程,

通知

这里没有啊,看我们这个代码,在这个BaseView里边,

通知

我在这块儿呢,写了一个hitTest方法,

- (UIView *)hitTest:(CGPoint ) point withEvent:(UIEvent *)event{

NSLog(@“%@------hitTest:”,[self class]);

return [super hitTest:point withEvent:event];

}

通知

我在这里边,写了一个这个hitTest方法,

然后呢,这个hitTest:方法,内部的一个参考实现,

通知

写到这儿了,

通知

这个里边,仅仅是hitTest:方法的参考的一个实现啊,至于说它的源代码是不是这么写的,那另说,

通知

只不过我们达到的效果,确实是这个样子的,

首先,我们先把这个hitTest:打开注释啊,

通知

这是系统的hitTest:

通知

我们先来看一下它都是怎么样调用的,先command + R,

通知

在这个里边儿啊,我们先不要管下面的这一张图片,

通知

1)当我点击这个紫色view的时候,我们说,是从下往上找,它是怎么找的,就是说,我们点击紫色的view的时候,

白色的执行:hit test:

紫色的执行:hit test:

紫色的执行:touchesBegan:

白色的执行:touchesBegan:

通知

我们从我选中的这个部分开始来看,

通知
通知

1)这个里边儿呢,实际上,它会先执行白色的hit test:

2)然后呢,执行了一个黄色的hit test:

3)再执行了一个紫色的hit test:

4)然后,这个紫色的,再去执行touchesBegan:

5)然后,白色的,再去执行touchesBegan:

输出了五句话,相当于是这样的一个过程啊,那么,接下来,我们就开始来说它的规则,

二、事件的产生和传递规则

1.当你点击以后,hit test:到底是怎么着去找的,我们来看这段儿代码,

通知

看这段代码,hit test:是怎么样去找的,

通知

只是参考的一个实现啊,真实是不是这么写的,另说,

通知

1)首先,当我点击任意一个view的时候,这个时候,它会产生一个触摸事件,然后,这个触摸事件,会添加到运行循环里边儿去,然后,从下往上的执行hit test:它的目标,是要找到合适处理这个点击事件的那个view,然后,开始执行touchesBegan:,hit test:就是这么找的一个过程啊,你点击紫色的view以后,它先按照我们这个ppt的顺序,先从下往上找,

通知

先找到Application,

然后找到Window,

然后找到RootViewController,

然后RootViewController再去找到它的Controller的view,也就是现在找到我们白色的view了啊,这时候,白色的view会第一次去执行hit test:也就是我们刚才输出的这个白色啊,

通知

白色的hit test:然后,白色的hitTest:都干了点儿什么事情啊,

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是用Objective-C纯代码实现的签到日期界面。实现的界面包括一个导航栏、一个显示当前日期的标签和一个签到按钮。 ViewController.h文件: ```objective-c #import <UIKit/UIKit.h> @interface ViewController : UIViewController @end ``` ViewController.m文件: ```objective-c #import "ViewController.h" @interface ViewController () @property (nonatomic, strong) UILabel *dateLabel; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // 设置导航栏标题 self.navigationItem.title = @"签到"; // 设置背景颜色 self.view.backgroundColor = [UIColor whiteColor]; // 创建并添加日期标签 self.dateLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 50)]; self.dateLabel.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2 - 50); self.dateLabel.textAlignment = NSTextAlignmentCenter; self.dateLabel.textColor = [UIColor blackColor]; [self.view addSubview:self.dateLabel]; // 更新日期标签的文本 [self updateDateLabel]; // 创建并添加签到按钮 UIButton *checkInButton = [UIButton buttonWithType:UIButtonTypeSystem]; checkInButton.frame = CGRectMake(0, 0, 200, 50); checkInButton.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2 + 50); [checkInButton setTitle:@"签到" forState:UIControlStateNormal]; [checkInButton addTarget:self action:@selector(checkInButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:checkInButton]; } // 更新日期标签的文本 - (void)updateDateLabel { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyy年MM月dd日"; self.dateLabel.text = [formatter stringFromDate:[NSDate date]]; } // 签到按钮点击事件 - (void)checkInButtonClicked:(UIButton *)sender { // TODO: 处理签到逻辑 // 更新日期标签的文本 [self updateDateLabel]; } @end ``` 在AppDelegate.m文件中,将ViewController设置为根视图控制器: ```objective-c #import "AppDelegate.h" #import "ViewController.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; ViewController *viewController = [[ViewController alloc] init]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; self.window.rootViewController = navigationController; [self.window makeKeyAndVisible]; return YES; } ``` 这样就完成了一个简单的签到日期界面的实现。运行程序后,可以看到一个带有日期标签和签到按钮的界面。点击签到按钮后,日期标签上的日期会更新为当前日期。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值