首页编程uicontrol(UIControl的触摸事件)

uicontrol(UIControl的触摸事件)

编程之家2023-11-01165次浏览

大家好,今天给各位分享uicontrol的一些知识,其中也会对UIControl的触摸事件进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

uicontrol(UIControl的触摸事件)

gui显示没有string属性

对于图像处理来说,Matlab有着巨大的优势,VisualC++常用来制作人机交互界面,其实Matlab制作GUI界面是十分简单的,只需要如下操作:1、在输入行:guide显示界面如下:2、选择创建新的gui,然后选择创建一个空的gui,同时注意保存的路径3、左边有许多控件:如按钮,在左边点击ok按钮,然后在右边网格区域点击一下即可(或者直接将ok按钮拉过去)。

4、pushbutton按钮,双击此按钮,会显示属性界面,然后就可以修改此按钮的各种属性:5、可以修改按钮的名字等信息。

6、右击按钮,可以选择viewcallbacks中的callback即可进行一个函数,此函数当点击按钮的时候就会被调用,在此函数中添加命令:msgbox('你好');7、然后点击此按钮就可以显示所想显示的内容。

谷歌人工智能写作项目:神经网络伪原创

如何在Matlab中打开GUI工具

两种方法1、输入guide回车写作猫。2、在工具栏里点击带笔形的gui。

uicontrol(UIControl的触摸事件)

为Matlab的GUI添加启动画面:添加启动画面,启动画面中可以添加想要添加的图像……VisualC++可以实现这个功能,Matlab也可以实现,具体如下:首先,新建立一个GUI,这个新建的GUI用于显示启动时想要添加的图像。

GUI中添加一个axes控件,然后在GUi的m文件中的OpeningFcn函数中就可以添加图像,程序如下:a=imread('你图像');%加载图axes(handles.axes1);%添加的axes的tag为axes1imshow(a);%显示同时在GUI的属性中将Gui名称改为“程序正在启动,请稍候…………”提示的话语。

然后,另外新建一个GUI,同时,在GUI中的m文件中的OpeningFcn函数中添加如下程序:mainHandle=gui2();%第一个GUI的名称为gui2pause(3);%显示3秒close(mainHandle);%显示3秒后,关闭这样,3秒后你的程序主界面就出来了。

MATLAB任务GUI简单操作,求大佬抱 20

function fifg=figure('name','FlipIt!','numbertitle','off','menubar','none');m=nan;while~(m>0&&n>0&&m==round(m)&&n==round(n)) ipt=inputdlg({'请输入行数:','请输入列数:'},'FlipIt!',1,{'5','5'}); if isempty(ipt) continue; else m=str2num(ipt{1});n=str2num(ipt{2}); endendAA=zeros(m,n);wt=.8*n/max([m,n]);ht=.8*m/max([m,n]);axes('position',[.5-wt/2,.5-ht/2,wt,ht],'xtick',0:n,'ytick',0:m,'color','none','xticklabel',[],'yticklabel',[],'zticklabel',[],'gridlinestyle','-','box','on');grid on;axis equal;axis([0,n,0,m]);[x,y,z]=sphere(21);A=[0 0 1;0-1 0;1 0 0]*[x(:),y(:),z(:)]'/2.5;x=reshape(A(1,:),22,[]);y=reshape(A(2,:),22,[]);z=reshape(A(3,:),22,[]);h=zeros(m,n);hold onfor i=1:n for j=1:m h(i,j)=surf(x+i-.5,y+j-.5,z);set(h(i,j),'AmbientStrength',1); endendshading interp;light('position',[1 1 1],'Style','infinite');lighting gouraudset(fg,'windowbuttondownfcn',{@wbd h},'userdata',{AA AA});uicontrol('String','我投降了,告诉我怎么做!

uicontrol(UIControl的触摸事件)

','fontsize',12,'Position', [10 5 200 25],'Callback',{@ft fg h});uicontrol('String','再来一盘,我来上瘾了!

','fontsize',12,'Position', [220 5 200 25],'Callback',@ag);az=linspace(180,0,50);el=linspace(-90,90,50);for i=1:50 view(az(i),el(i));pause(0.02);endtitle('把所有的球都反过来!

');function wbd(src,eventdata,h)p=get(gca,'currentpoint');p=ceil(p(1,1:2));mi=get(gca,'xlim');mi=mi(2);mj=get(gca,'ylim');mj=mj(2);ii=p(1);jj=p(2);if iimj return;endA=get(src,'userdata');B=A{2};A=A{1};A(jj,ii)=~A(jj,ii);for i=1:11; for j=-1:1 try c=get(h(ii+j,jj),'cdata'); set(h(ii+j,jj),'cdata',[c(:,2:end),c(:,1)]); B(jj,ii+j)=~B(jj,ii+j); end end for j=[-1 1] try c=get(h(ii,jj+j),'cdata'); set(h(ii,jj+j),'cdata',[c(:,2:end),c(:,1)]); B(jj+j,ii)=~B(jj+j,ii); end end pause(0.02);endset(src,'userdata',{A,B});if all(B) msgbox('你真聪明!','恭喜!');endfunction ag(obj,eventdata)close;fi;function ft(obj,eventdata,f,h)title('计算中,请等待...');pause(0.02)A=get(f,'userdata');A0=A{2};[m,n]=size(A0);At=ones(m,n);b=reshape(xor(A0,At),[],1);A=[];for j=1:n for i=1:m bs=zeros(m+2,n+2);bs(i+1,j:j+2)=1; bs(i:i+2,j+1)=1;bs=bs(2:m+1,2:n+1); A=[A,bs(:)]; endendAb=[A,b];k=1;zy=[];for j=1:m*n+1 i=find(Ab(k:end,j),1)+k-1; if~isempty(i) Ab([k,i],:)=Ab([i,k],:);zy=[zy,j]; Ab(k+1:end,j:end)=xor(Ab(k+1:end,j:end),repmat(Ab(k,j:end),m*n-k,1)&repmat(Ab(k+1:end,j),1,m*n-j+2)); k=k+1; endendif zy(end)==m*n+1 disp('无解!

');return;endi=length(zy);for j=fliplr(zy) Ab(1:i-1,j:end)=xor(Ab(1:i-1,j:end),repmat(Ab(i,j:end),i-1,1)&repmat(Ab(1:i-1,j),1,m*n-j+2)); i=i-1;endx=zeros(m*n,1);x(zy)=Ab(1:length(zy),end);B=reshape(x,m,n);title('演示中,请仔细看,不要乱按鼠标。

')for ii=1:n for jj=1:m if(B(jj,ii)) for t=1:11; for j=-1:1 try c=get(h(ii+j,jj),'cdata'); set(h(ii+j,jj),'cdata',[c(:,2:end),c(:,1)]); end end for j=[-1 1] try c=get(h(ii,jj+j),'cdata'); set(h(ii,jj+j),'cdata',[c(:,2:end),c(:,1)]); end end pause(0.02); end pause(0.2); end endendtitle('演示完毕。

爽吧!')。

如何在matlab中建立一个简单的图形用户界面

创建一个完整的Matlab/GUI步骤:在MATLAB的命令窗口(CommandWindow)中运行guide命令,来打开GUIDE界面,如下:然后,选择空模板(BlangGUI),点击OK,即可打开GUIDE的设计界面,如下:点击工具栏上的菜单编辑器(MenuEditor),打开菜单编辑器,如下:在MenuBar中新建一个菜单项,名字为“文件”,其他设置请看下图:在“文件”菜单下添加菜单项:“打开”,“保存”,“退出”。

见下图:如果需要在菜单项“退出”上面添加一个分割线的话,选中“Separatorabovethisitem”就行了。

保存我的界面为.保存完毕之后,会自动打开pjimage.m文件,而我们所有的程序都是要写在这个M文件里面的。在编程中,我们的每一个鼠标动作都对应一个Callback函数。

那么我们的菜单项也是如此的。在界面上,单击鼠标右键选择“PropertyInspector”,即可打开属性窗口。当我们点击不同的控件时,其对应的属性都会在这里显示,我们可以进行修改。

最主要的属性莫过于Tag属性和String属性。设置当前Figure窗口的Tag属性为:figure_pjimage,窗口的标题(Name属性)为:图像处理实例。如下:然后,点击工具栏的保存按钮。

之后,点击工具栏的运行按钮(RunFigure)。

注意,工具栏的图标都会有提示的,像运行按钮的提示就是RunFigure.我们会看到如下的界面:那说明,我们保存的.fig文件的目录不是当前目录,但是没关系啊,我们只要点击“ChangeDirectory”来改变当前目录。

当然,如果你想把当前目录添加到MATLAB路径也可以,那就点击“AddtoPath”就OK了。

我在这里推荐点击“ChangeDirectory”,因为没有什么太大必要把其添加到MATLAB路径中,一般是工具箱需要添加或者我们的函数或程序写完了,而在MATLAB的命令窗口找不到我们的函数的时候,我们可以将函数或程序所在的目录添加到MATLAB路径。

总之吧,点那个按钮,要看个人的爱好了。不管点击两个按钮的那一个按钮,都会正确的运行程序的。

我们的程序运行时的样子,是这样的:文件下面的菜单项和快捷键我们都能看到,但是我们没有写程序,所以就算点也没有什么响应。

还有如果不想设置快捷键,可以在MenuEditor中设置,只要把其选择为Ctrl+none就行了,如下:这样的话,保存项就没有了快捷键了。

我们可以通过上面的按钮“View”来查看该菜单项的响应函数,也就是Callback函数。

也可以在pjimage.m中看,比如保存的Tag属性是m_file_save,那么它对应的Callback函数的名字就是m_file_save_Callback。依次类推了。

下面我们来写打开菜单项的函数,要打开一个图片,当然要用打开对话框了。在界面编程中,打开对话框的函数是uigetfile.关于它的详细的说明用helpuigetfile命令查看。

下面是打开菜单的响应函数:[plain]viewplaincopyprint?functionm_file_open_Callback(hObject,eventdata,handles)[filename,pathname]=uigetfile(...{'*.bmp;*.jpg;*.png;*.jpeg','ImageFiles(*.bmp,*.jpg,*.png,*.jpeg)';...'*.*','AllFiles(*.*)'},...'Pickanimage');保存.m文件,并运行程序。

点击“文件”下的“打开”,会打开如下的打开对话框:选择一个文件之后,程序中的filename就是你选择的文件的文件名,pathname就是该文件所在的目录的路径。

比如:filename,pathname=C:\DocumentsandSettings\Administrator\MyDocuments\。

那么获得路径之后,我们要怎么样才能读入和显示一个图片呢?读入图片可以用imread函数,而显示可以在一个坐标轴上。

那么我们需要在界面上画上一个坐标轴,为了对比,我们画两个坐标轴,一个显示处理前,一个显示处理后的。并且将处理前的坐标轴的Tag属性改为axes_src,处理后的坐标轴的Tag属性为axes_dst。

更改之后,保存。

如下:然后在m_file_open_Callback程序原来的基础上,再添加如下的程序:[plain]viewplaincopyprint?axes(handles.axes_src);%用axes命令设定当前操作的坐标轴是axes_srcfpath=[pathnamefilename];%将文件名和目录名组合成一个完整的路径imshow(imread(fpath));%用imread读入图片,并用imshow在axes_src上显示运行程序,通过“打开”菜单项,打开一个图片。

效果如下:那么如何来保存一副图片?用imwrite命令。但imwrite命令的第一个参数就是你读入的图片数据,也就是imread的返回值。

这样的话,我们就要将m_file_open_Callback中的程序做一点小小的改动。

将最后一句(imshow(imread(fpath))),更改为两句,如下:[plain]viewplaincopyprint?img_src=imread(fpath);imshow(img_src);不仅如此,我们的保存菜单的Callback函数,如何去获得打开菜单的Callback函数下的img_src变量呢?

这里就要将img_src来作为一个共享的数据。许多界面编程的朋友,喜欢用global声明。我个人不喜欢这样用,因为有更好的方法。那就是用setappdata和getappdata两个函数。

我们可以为界面上面的任何一个具有Tag属性的控件添加应用程序数据。当然我比较喜欢将这些共享的应用程序数据统一添加到Figure窗口上,因为这样容易记,如果一个控件一个,感觉不容易记。

你在.m文件中会发现除了各个菜单项的Callback函数以外,还有两个函数:pjimage_OpeningFcn和pjimage_OutputFcn.而pjimage_OpeningFcn就相当于界面的初始化函数,而pjimage_OutputFcn则是界面的输出函数,也就是当你不运行fig,而调用.m文件时的返回值。

所以,我们要在pjimage_OpeningFcn中添加如下的程序,来共享这个img_src矩阵。

代码如下:[plain]viewplaincopyprint?setappdata(handles.figure_pjimage,’img_src’,0);然后,在m_file_open_Callback函数的最后写上如下程序:[plain]viewplaincopyprint?setappdata(handles.figure_pjimage,’img_src’,img_src);那么,我们在m_file_save_Callback函数中就可以像这样的来提取img_src,如下:[plain]viewplaincopyprint?img_src=getappdata(handles.figure_pjimage,’img_src’);保存的时候,自然会用到保存对话框了。

要用保存对话框,就要用到uiputfile函数了,具体的请用helpuiputfile查看。

那么,保存菜单项下的程序(m_file_save_Callback),可以这样写:[plain]viewplaincopyprint?[filename,pathname]=uiputfile({'*.bmp','BMPfiles';'*.jpg;','JPGfiles'},'PickanImage');ifisequal(filename,0)||isequal(pathname,0)return;%如果点了“取消”elsefpath=fullfile(pathname,filename);%获得全路径的另一种方法endimg_src=getappdata(handles.figure_pjimage,'img_src');%取得打开图片的数据imwrite(img_src,fpath);%保存图片下面是退出菜单项的程序的。

要退出界面,只要用close函数就行了,但是通常都会有提示的。比如你如果进行了处理图片,而又没有保存处理后的图片,那么在关闭的时候就应该给出提示,询问是否进行保存。

不过,在这里,我们先不做这个工作,等后面有需要的时候再写吧。

因此,这里的退出菜单项的程序就是一句,如下:[plain]viewplaincopyprint?close(handles.figure_pjimage);其实,用delete函数也是可以的,就是:delete(handles.figure_pjimage);

iOS事件机制(点击、手势、UIControl)

注意:对于一个手指的触摸,是UITouch每次状态改变的时候都会回调UIResponder相对应的处理方法。对于多个手指的触摸,也许多个UITouch状态的改变一起回调UIResponder的处理方法,也许每个UITouch状态的改变都会回调UIResponder的处理方法,例如,两个点击,可能只有一个touchesBegan的回调,两个touchesEnded的回调.同时,多个UIControl状态改变只有一次touchesBegan等方法回调的参数touches里touch的个数我测试的时候只有一个,不要以为所有状态改变的UITouch只有一次回调时都会放到touches参数里。关于多点触摸的处理个人不建议在UITouch的响应机制里去做处理,里面具体原理并不明朗,实际开发中的借鉴也不多,涉及多点触摸使用手势更好。

UIResponder是iOS中用于处理用户事件的API,可以处理触摸事件、按压事件(3D touch)、远程控制事件、硬件运动事件。可以通过touchesBegan、pressesBegan、motionBegan、remoteControlReceivedWithEvent等方法,获取到对应的回调消息。UIResponder不只用来接收事件,还可以处理和传递对应的事件,如果当前响应者不能处理,则转发给其他合适的响应者处理。

应用程序通过响应者来接收和处理事件,响应者可以是继承自UIResponder的任何子类,例如UIView、UIViewController、UIApplication等。当事件来到时,系统会将事件传递给合适的响应者,并且将其成为第一响应者。

第一响应者未处理的事件,将会在响应者链中进行传递,传递规则由UIResponder的nextResponder决定,可以通过重写该属性来决定传递规则。当一个事件到来时,第一响应者没有接收消息,则顺着响应者链向后传递。

Gesture Recognizer是对底层事件处理的封装,是为了让使用者能够更简单处理事件。

手势分为离散型手势(discrete gestures)和持续型手势(continuous gesture)。

手势响应过程:

手势状态:

UIControl是系统提供的能够以target-action模式处理触摸事件的控件,iOS中UIButton、UISegmentedControl、UISwitch等控件都是UIControl的子类。

值得注意的是,UIConotrol是UIView的子类,因此本身也具备UIResponder应有的身份。

UIControl作为控件类的基类,它是一个抽象基类,我们不能直接使用UIControl类来实例化控件,它只是为控件子类定义一些通用的接口,并提供一些基础实现,以在事件发生时,预处理这些消息并将它们发送到指定目标对象上。

UIControl的触发过程:

四个重要识别方法是在touchesBegan、touchesMoved、touchedEnded、touchesCancelled里回调的。

推测是:endTrackingWithTouch调用后识别了行为,做标记,返回到touchesEnded后,判断本UIControl是否易识别行为,调用行为回调。

App接收到触摸事件后,会被放入当前应用程序的UIApplication维护的事件队列中.

由于事件一次只有一个,但是能够响应的事件的响应者众多,所以这就存在一个寻找第一响应者的过程。

调用方法,获取到被点击的视图,也就是第一响应者。

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

hitTest:withEvent:方法内部会通过调用pointInside:这个方法,来判断点击区域是否在视图上,是则返回YES,不是则返回NO。

经过Hit-Testing的过程后,UIApplication已经知道了第一响应者是谁,接下来要做的事情就是:

自定义的view的touchesBegan、touchesMoved、touchesEnded、touchedCancelled四个方法重写,记录打印过程,该view上添加tapGestureRecognized手势,该tapGestureRecognized也覆写了这四个方法。

点击view调用打印过程输出:

调用栈:

结合上面的输出和调用栈,我们可能并不能明确的看出有手势的时候点击的过程,不过如果你自己调试,是能得出如下结论的:

UIGestureRecognizer和UITouch的关系可以由UIGestureRecognizer的三个属性影响:cancelsTouchesInView、delaysTouchesBegan、delaysTouchesEnded。

本身就是在UIResponder的UITouchesBegan、UITouchesMoved、UITouchedEnded、UITouchesCancel四个回调中调用的。

UIControl的响应处理并不会影响UIResponder的响应链的处理,但是UIControl会影响另一个UIControl,子视图的UIControl具有优先级。

UIGestureRecognizer和UIControl并没有决定的优先级。

从iOS6开始在控件的父视图上面添加相应的手势,控件就会控制阻止手势行为,比如:

tap手势在 UIButton,UISwitch,UIStepper,UISegmentControl,UIPageControl;

swipe手势在 UISlider;

pan手势在 UISwitch;

其他可能是手势优于控件的行为。

UIResponder有touchesBegan等四个方法,默认向superview传递。

所有需要自定义点击处理逻辑的UIResponder子类要覆盖这四个方法。

点击事件由四个方法处理。

UIButton的处理也是需要经过这四个方法。

UIGestureRecognizer也有touchesBegan等四个方法。

手势不在响应链里,但是也会观察它的view和subView的点击。

UIGestureRecognizer会影响UIResponder的四个响应点击的方法。

默认点击事件响应关键步骤说明:

1)用户手指点击屏幕,经过系统传递到UIApplication, UIApplication通过hitTest:方法找到对应UITouch发生的第一响应者view

2)UIApplication更新手势状态,从第一响应者上的手势到其视图层上所有先辈视图上的手势都会接收这个UITouch来更新手势状态

3)UIApplication将UITouch交给找到的第一响应着view处理

4)UIApplication更新手势状态,识别成功后,会向UITouch的第一响应者发送cancel方法

加上UIControl会让过程变得复杂,关于UIControl的原理,不清楚,也不敢妄下结论,依据网上和实际测试大致推断:

1)它不会影响UITouch本身的响应流程,但是会影响其他UIControl和UIGestureRecognizer的响应

2)自定义的UIControl是和UITouch本身的响应过程是一样的

3)系统定义的UIControl和UIGestureRecognizer同一个优先级,谁先识别出来,另一个就out了,但是UIControl和UIGestureRecognizer有一点不同,它并不会cancel UITouch的流程。

关于UITouch、UIGestureRecognizer、UIControl之间影响说明:

1)UITouch和UIGestureRecognizer:UIGestureRecognizer优先级高于UITouch,由UIGestureRecognizer的三个参数cancelsTouchesInView、delaysTouchesBegan、delaysTouchesEnded决定对UITouch的影响,默认情况下,UIGestureRecognizer识别成功后,会向UITouch发送cancel

避免:

1)尽量不要覆盖重写UIResponder的touchesBegin、touchesMoved、touchesCancelled、touchesEnded这四个方法,如果需要覆盖重写,逻辑应该尽量简单,不宜做复杂的处理,

2)不要自定义UIControl,直接使用系统定义的UIControl

3)UIControl上不要添加UIControl子视图

4)不要依赖UIGestureRecognizer的delayTouchBegin和delayTouchEnded

5)不要自定义UIGestureRecognizer

参考文章:

1) iOS事件(UITouch、UIControl、UIGestureRecognizer)传递机制

2) Touch Event Handing教学— part 1

UIControl的触摸事件

UIControl是继承于UIView的一个子类,能够响应触摸事件(基本能够响应触摸事件都是继承于此类)

首先我们来了解一个触摸事件在iOS中是怎么进行的,系统是怎么反馈的

1.手指触碰屏幕,屏幕感应到触碰后,将事件交由IOKit处理。

2.IOKit将触摸事件封装成一个IOHIDEvent对象,并通过mach port传递给SpringBoad进程。

3.SpringBoard进程因接收到触摸事件,触发了主线程runloop的source1事件源的回调。

此时SpringBoard会根据当前桌面的状态,判断应该由谁处理此次触摸事件。因为事件发生时,你可能正在桌面上翻页,也可能正在刷微博。若是前者(即前台无APP运行),则触发SpringBoard本身主线程runloop的source0事件源的回调,将事件交由桌面系统去消耗;若是后者(即有app正在前台运行),则将触摸事件通过IPC传递给前台APP进程,接下来的事情便是APP内部对于触摸事件的响应了。

那app是如何做响应的呢?

每个响应者都是一个UIResponder对象,即所有派生自UIResponder的对象,本身都具备响应事件的能力。因此以下类的实例都是响应者:

UIView

UIViewController

UIApplication

AppDelegate

响应者之所以能响应事件,因为其提供了4个处理触摸事件的方法:

这四个方法稍后再说,我们来看触摸事件是如何传递的

APP接收到触摸事件后,会被放入当前应用的一个事件队列中,出队后,application首先将事件传递给当前应用最后显示的窗口(UIWindow)询问其能否响应事件。若窗口能响应事件,则传递给子视图询问是否能响应,子视图若能响应则继续询问子视图。子视图询问的顺序是优先询问后添加的子视图,即子视图数组中靠后的视图。

可以看图

视图层级如下:

现在假设在E视图所处的屏幕位置触发一个触摸,应用接收到这个触摸事件事件后,先将事件传递给UIWindow,然后自下而上开始在子视图中寻找最佳响应者。事件传递的顺序如下所示:

·UIWindow将事件传递给其子视图A

·A判断自身能响应该事件,继续将事件传递给C(因为视图C比视图B后添加,因此优先传给C)。

·C判断自身能响应事件,继续将事件传递给F(同理F比E后添加)。

·F判断自身不能响应事件,C又将事件传递给E。

·E判断自身能响应事件,同时E已经没有子视图,因此最终E就是最佳响应者。

每个响应者必定都是UIResponder对象,通过4个响应触摸事件的方法来响应事件。每个UIResponder对象默认都已经实现了这4个方法,但是默认不对事件做任何处理,单纯只是将事件沿着响应链传递。若要截获事件进行自定义的响应操作,就要重写相关的方法。例如,通过重写 touchesMoved: withEvent:方法实现简单的视图拖动。

UIControl作为能够响应事件的控件,有其独特的跟踪方式

这4个方法和UIResponder的那4个方法几乎吻合,只不过UIControl只能接收单点触控,因此接收的参数是单个UITouch对象。这几个方法的职能也和UIResponder一致,用来跟踪触摸的开始、滑动、结束、取消。不过,UIControl本身也是UIResponder,因此同样有 touches系列的4个方法。事实上,UIControl的 Tracking系列方法是在 touch系列方法内部调用的。比如 beginTrackingWithTouch是在 touchesBegan方法内部调用的,因此它虽然也是UIResponder,但 touches系列方法的默认实现和UIResponder本类还是有区别的。

当UIControl跟踪事件的过程中,识别出事件交互符合响应条件,就会触发target-action进行响应。UIControl控件通过 addTarget:action:forControlEvents:添加事件处理的target和action,当事件发生时,UIControl通知target执行对应的action。说是“通知”其实很笼统,事实上这里有个action传递的过程。当UIControl监听到需要处理的交互事件时,会调用 sendAction:to:forEvent:将target、action以及event对象发送给全局应用,Application对象再通过 sendAction:to:from:forEvent:向target发送action。

因此,可以通过重写UIControl的 sendAction:to:forEvent:或 sendAction:to:from:forEvent:自定义事件执行的target及action。

另外,若不指定target,即 addTarget:action:forControlEvents:时target传空,那么当事件发生时,Application会在响应链上从上往下寻找能响应action的对象。

非常感谢您的阅读!我们希望本文对于解决您关于uicontrol和UIControl的触摸事件的问题提供了一些有价值的信息。如果您还有其他疑问,我们将很乐意为您提供进一步的帮助。

服务器硬件监控,通过哪些方式可以实现服务器硬件监控vbmid(vb中的mid函数)