我正在写一个放射状菜单,当你在屏幕上长按(UILongPressGestureRecognizer)时,它弹出一个按钮菜单,我可以拖动我的手指(已经触摸屏幕)按钮,选择,然后当我放手时,它执行特定于该按钮的动作。
我目前将径向菜单作为UIControl子类,我试图覆盖beginTrackingWithTouch:
和continueTrackingWithTouch:
,但长按显示菜单(将其添加到superview) ,不会转移到UIControl识别的触摸。
任何想法我能如何"转发"这个触摸事件来自UIControl的超级视图吗?
谢谢!
答案 0 :(得分:1)
不是直接答案,但您应该真正关注今年的滚动视图的WWDC会议。然后再看一遍。它包含大量信息,而且肯定是您问题的答案。会议235:高级滚动视图和触摸处理技术。
答案 1 :(得分:1)
我会这样做......
长按处理程序:
-(IBAction)onLongPress:(UILongPressGestureRecognizer*)recognizer
{
CGPoint point = [recognizer locationInView:self.view];
if (recognizer.state == UIGestureRecognizerStateBegan) {
//create the radial view and add it to the view
CGSize radialViewSize = CGSizeMake(80, 80);
radialView = [[RadialView alloc] initWithFrame:CGRectMake(point.x - radialViewSize.width/2, point.y - radialViewSize.height/2, radialViewSize.width, radialViewSize.height)];
[self.view addSubview:radialView];
radialView.backgroundColor = [UIColor redColor];
} else if (recognizer.state == UIGestureRecognizerStateEnded) {
[radialView onTouchUp:[radialView convertPoint:point fromView:self.view]];
[radialView removeFromSuperview];
radialView = nil;
}
}
在径向视图中:(我认为径向视图将按钮保持在数组中)
-(void)onTouchUp:(CGPoint)point
{
for (UIButton *button in buttons) {
if ([button pointInside:[self convertPoint:point toView:button] withEvent:nil]) {
//This button got clicked
//send button clicked event
[button sendActionsForControlEvents:UIControlEventTouchUpInside];
}
}
}
我知道它并不完美,因为触摸事件不会转发到径向视图(如您所知),但它让您点击按钮。希望它有所帮助!
答案 2 :(得分:0)
我不确定这是否与您正在寻找的行为相同,但我最近在开发Concentric Radial Menu时必须克服完全相同的问题。我很快发现的事情是,在触摸事件期间添加到视图层次结构中的视图没有经过重新测试,因此在下一个事件发生之前似乎没有响应。
我使用的解决方案,我不能说我喜欢,是实现一个拦截- (void)sendEvent:(UIEvent *)event
的自定义UIWindow子类,并将这些事件转发到“活动”放射状菜单。
也就是说,菜单在激活时注册窗口,然后在卸载时取消注册。如果以原子方式完成,这实际上是一种非常安全的技术,我只是希望它比它更清洁。
祝你好运!