San*_*ier 3 subclass objective-c uicontrol ios
我目前正在开发一个自定义的UIControl子类.要跟踪触摸,我使用以下方法:
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
NSLog(@"Start");
CGPoint location = [touch locationInView:self];
if ([self touchIsInside:location] == YES) {
//Touch Down
[self sendActionsForControlEvents:UIControlEventTouchDown];
return YES;
}
else {
return NO;
}
}
Run Code Online (Sandbox Code Playgroud)
这可以按预期工作,并且@"Start"一次只能显示出来.下一步是我用UIControlEventTouchDown添加一个Target和一个Selector.
[markItem addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
Run Code Online (Sandbox Code Playgroud)
这也有效,并且调用了action:方法.但那是我的问题.该动作被调用两次.我究竟做错了什么?我只使用[self sendActionsForControlEvents:UIControlEventTouchDown];
一次,目标动作被调用两次.我的代码出了什么问题?
桑德罗梅尔
Dad*_*Dad 11
一旦调用,事件调度程序会自动发生对action方法的第一次调用:
[markItem addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
Run Code Online (Sandbox Code Playgroud)
注册处理程序.
所以,当你打电话:
//Touch Down
[self sendActionsForControlEvents:UIControlEventTouchDown];
Run Code Online (Sandbox Code Playgroud)
您正在为您的处理程序(以及其他任何连接的程序)生成第二个调用.
所以看起来你不需要动作处理程序和beginTracking - 使用一个或另一个.
更新:
鉴于你的评论和进一步的想法:既然你是UIControl的子类,我想你可能不想为自己注册事件处理程序.
相反,你应该专门使用:
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;
- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)cancelTrackingWithEvent:(UIEvent *)event; // event may be nil if cancelled for non-event reasons, e.g. removed from window
Run Code Online (Sandbox Code Playgroud)
也是tracking
实例变量.
所以我认为你不应该发布事件或听事件.此外,如果它不在您的视图中,它是否真的可以获得beginTrackingWithTouch事件?似乎不会.因此,我认为您不需要进行测试,看看它是否在您的视野中.
因此,我认为可能值得退一步思考您正在尝试做什么并重新阅读UIControl文档.特别:
子类注释 您可能希望扩展UIControl子类有以下两个原因:
观察或修改将动作消息分派给特定事件的目标要执行此操作,请覆盖
sendAction:to:forEvent:
,评估传入的选择器,目标对象或UIControlEvents
位掩码,然后根据需要继续操作.要提供自定义跟踪行为(例如,更改高亮外观)要做到这一点,覆盖一个或所有下面的方法:
beginTrackingWithTouch:withEvent:
,continueTrackingWithTouch:withEvent:
,endTrackingWithTouch:withEvent:
.
第一部分是让您的UIControl
子类为您的控件的客户端或用户执行目标操作处理的非标准处理(这听起来不像您尝试做的那样,尽管您没有真正提供高级描述).
第二部分听起来更像您想要做的事情 - 您的UIControl
子类中的自定义跟踪.
归档时间: |
|
查看次数: |
5000 次 |
最近记录: |