UIEvent UIResponder UI_04

简介:
1、事件(UIEvent),是由硬件设备捕捉到用户对设备的操作,把这个操作抽象成一个事件对象
    ios中三大事件:触 Touches 摸晃动事件Motion,远程控制事件RemoteControl其中应有最广泛的是触摸事件
UIView是支持触摸的,由于UIView 内部没有实现跟触摸相关的方法,所以我们再点击UIView创建其子类进行方法实现
2、一般准备做题思路:先在 AppDelegate.m中建立一个 TouchVC对象
TouchViewController *touchVC = [[TouchViewController alloc]init];
    
//将touchVC指定self.window的为根视图控制器
    
self.window.rootViewController = touchVC;
    [touchVC release];
然后在 TouchViewController.m中设置颜色
self.view.backgroundColor = [UIColor yellowColor];
————————————————————————————
以上方法为通常准备方法:
第一类型:点击移动视图
     MoveView *moveView = [[MoveView alloc]initWithFrame:CGRectMake(110, 234, 100, 100)];
     moveView.backgroundColor = [UIColor blackColor];
     [self.view addSubview:moveView];
     [moveView release];
第二类型:捏合视图对象
    PinchView *pinchView = [[PinchView alloc]initWithFrame:CGRectMake(60184200200)];
    pinchView.
backgroundColor = [UIColor orangeColor];
    [
self.view addSubview:pinchView];
    [pinchView release];
————————————————————————————
首先总结点击移动视图:
TouchView.m
//如果想让一个视图对象对触摸事件作出反应,需要在这个类中的.m文件中实现跟触摸相关一些方法
//当手指在视图范围内移动的时候触发
- (
void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
//        self.backgroundColor = [UIColor randomColor];
    
self.center = CGPointMake(arc4random_uniform(220 - 100 + 1) + 100arc4random_uniform(468 - 100 +1) +100);
    
//取出手指对像
    
UITouch *f = [touches anyObject];
    
//当前手指的 位置
    
CGPoint location = [f locationInView:self];
    
//之前手指位置
    
CGPoint previousLocation = [f previousLocationInView:self];
    
CGPoint center = self.center;
    
CGFloat dx = location.x - previousLocation.x;
    
CGFloat dy = location.y - previousLocation.y;
    
self.center = CGPointMake(center.x + dx, center.y + dy);
    NSLog(@"%s",__FUNCTION__);
TouchView.m
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    
   
//1.获取手指对象
    
UITouch *finger = [touches anyObject];
    //2.获取手指当前在自身视图的位置
    CGPoint currentLocation = [finger locationInView:self];
    //3.获取手指之前在视图上的位置
    CGPoint  previousLocation = [finger previousLocationInView:self];
    //4.计算手指在x轴和y轴上的增量
    
//手指在x轴上的增量

    
CGFloat dx = currentLocation.x - previousLocation.x;
        
//手指在y轴上的增量
    CGFloat dy = currentLocation.y - previousLocation.y;
    //获取中心点,之前center的位置
    
CGPoint center = self.center;
    
self.center = CGPointMake(center.x + dx, center.y + dy);
}
@end

——————————————————————————————————————————
第二种类型捏合视图对象:
首先要把默认的单触点关掉
PinchView.m  继承自UIView
-(instancetype)initWithFrame:(CGRect)frame{
    
if (self = [super initWithFrame:frame]) {
        
//ios支持多点触摸,只是默认是单点触摸
        
self.multipleTouchEnabled = YES;
    }
    
return self;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    
    
//如果集合中touch集合中手指对象个数为1,就直接返回touchsMoved方法
    
if (1 == touches.count) {
        
return;//结束方法
    }
else{
        
//得到集合中所有手指对象,并使用数组存储(数组有序)
    NSArray *allTouchs = [touches allObjects];
        //取出两个触点
        UITouch *touch1 = [allTouchs firstObject];
        
UITouch *touch2 = [allTouchs lastObject];
        
//求出两个手指对象当前的位置
        
CGPoint  firstTouch1 = [touch1 locationInView:self];
        
CGPoint secondTouch2 = [touch2 locationInViewself];
    
//求出当前两个手指的间距
        
CGFloat currentDistance = [self distanceFromeFirstPoint:firstTouch1 secondPoint:secondTouch2];
        
//求出之前两个手指的位置
        
CGPoint previousFirstPoint = [touch1 previousLocationInView:self];
        
CGPoint previousSecondPoint = [touch2 previousLocationInView:self];
        
//求出之前两个点的距离
        CGFloat previousDistance = [self distanceFromeFirstPoint:previousFirstPoint secondPoint:previousSecondPoint];
        //获取捏合前后两个手指间距的比例
        
CGFloat rate = currentDistance / previousDistance;
        
//缩放视图,如果视图的大小发生变化时,而中心点的位置不发生变化,修改bounds就可以了
        
self.bounds = CGRectMake(00self.bounds.size.width * rate, self.bounds.size.height * rate);
    }
}

//封装一个计算距离的方法(sqrt求开方)
- (
CGFloat)distanceFromeFirstPoint : (CGPoint)firstPoint  secondPoint : (CGPoint)secondPoint{
    
CGFloat dx = firstPoint.x - secondPoint.x;
    
CGFloat dy = firstPoint.y - secondPoint.y;
    
//当前两点距离
    
return  sqrt(dx * dx + dy * dy);
}


================================================================================
响应者链:
AppDelegate.m
//创建 Responder对象
    ResponderViewController *responderVC = [[ResponderViewController alloc]init];
    //将responderVC指定为根控制器
    
self . window . rootViewController  = responderVC;
    [responderVC release];
ResponderViewController.m
1、  UIResponder 响应者类,继承自NSObject,它是一个响应者的基类,它提供了一些处理事件的方法
//什么是响应者(响应者对象):1.继承自UIResponder 2.能对ios事件中(触摸事件,晃动事件,远程事件)做出响应的对象就叫做响应者
// UILabel ,UIImageView  默认用户交互是关闭的
响应者链:确定事件作用的对象时,UIAppcation --->UIAppcationDelegate--->window--->视图控制器--->视图控制器上的子视图
响应事件:(有大到小)视图控制器上的子视图--->视图控制器--->window--->UIAppcationDelegate---UIAppcation 如果都不处理这个事件,事件就会被丢弃
ResponderView.m
   ResponderView *redView = [[ResponderView alloc]initWithFrame:[UIScreenmainScreen].bounds];
    redView.
tag = 101;
    redView.
userInteractionEnabled = NO;
    redView.
backgroundColor = [UIColor redColor];
    [
self.view addSubview:redView];
    [redView 
release];
 
    ResponderView *yellowView = [[ResponderView alloc]initWithFrame:CGRectMake(30360320284)];
    yellowView.
tag = 102;
    
//关闭用户的交互造成响应者链就到这个位置断开了,事件只能找他的上一级处理,如果上一级都不处理,此事件就不了了之了
    yellowView.
userInteractionEnabled = YES;
    yellowView.
backgroundColor = [UIColor yellowColor];
    [redView 
addSubview:yellowView];
    [yellowView 
release];
    
    
    
ResponderView *greenView = [[ResponderView alloc]initWithFrame:CGRectMake(2020280244)];
    greenView.
tag = 103;
    greenView.
backgroundColor = [UIColor greenColor];
    [yellowView 
addSubview:greenView];
    [greenView 
release];
    
    
ResponderView *blueView = [[ResponderView alloc]initWithFrame:CGRectMake(2020240204)];
    blueView.
tag = 104;
    blueView.
backgroundColor = [UIColor blueColor];
    [greenView 
addSubview:blueView];
    [blueView release];
}
ResponderView.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    switch (self.tag) {
        
case 101:
            
NSLog(@"红色视图");
            
break;
            
case 102:
            
NSLog(@"黄色视图");
            
break;
            
case 103:
            
NSLog(@"绿色视图");
            
break;
            
case 104:
            
NSLog(@"蓝色视图");
            
break;
        
default:
            
break;
    }
==============================================
欢迎学习本文,未经博主许可,禁止转载!
相关文章
|
iOS开发
UIEvent UIResponder UI_04
1、事件(UIEvent),是由硬件设备捕捉到用户对设备的操作,把这个操作抽象成一个事件对象     ios中三大事件:触Touches摸晃动事件Motion,远程控制事件RemoteControl;其中应有最广泛的是触摸事件 UIView是支持触摸的,由于UIView 内部没...
623 0
|
14天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
2月前
|
开发框架 JavaScript 前端开发
鸿蒙NEXT开发声明式UI是咋回事?
【10月更文挑战第15天】鸿蒙NEXT的声明式UI基于ArkTS,提供高效简洁的开发体验。ArkTS扩展了TypeScript,支持声明式UI描述、自定义组件及状态管理。ArkUI框架则提供了丰富的组件、布局计算和动画能力。开发者仅需关注数据变化,UI将自动更新,简化了开发流程。此外,其前后端分层设计与编译时优化确保了高性能运行,利于生态发展。通过组件创建、状态管理和渲染控制等方式,开发者能快速构建高质量的鸿蒙应用。
122 3
|
1月前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
91 8
|
2月前
|
JavaScript API 开发者
掌握ArkTS,打造HarmonyOS应用新视界:从“Hello World”到状态管理,揭秘鸿蒙UI开发的高效秘诀
【10月更文挑战第19天】ArkTS(ArkUI TypeScript)是华为鸿蒙系统中用于开发用户界面的声明式编程语言,结合了TypeScript和HarmonyOS的UI框架。本文介绍ArkTS的基本语法,包括组件结构、模板和脚本部分,并通过“Hello World”和计数器示例展示其使用方法。
63 1
|
7月前
|
Android开发 缓存 双11
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
|
2月前
|
缓存 测试技术 C#
使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题
【10月更文挑战第20天】本文介绍了使用 Radzen Blazor 组件库开发基于 ABP 框架的炫酷 UI 主题的步骤。从准备工作、引入组件库、设计主题、集成到 ABP 框架,再到优化和调试,详细讲解了每个环节的关键点和注意事项。通过这些步骤,你可以打造出高性能、高颜值的应用程序界面。
|
3月前
|
前端开发 开发者 UED
前端只是切图仔?来学学给开发人看的UI设计
该文章针对前端开发者介绍了UI设计的基本原则与实践技巧,覆盖了布局、色彩理论、字体选择等方面的知识,并提供了设计工具和资源推荐,帮助开发者提升产品的视觉与交互体验。
|
2月前
|
JavaScript 索引
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
128 0
|
4月前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!