【发布时间】:2011-11-16 05:36:01
【问题描述】:
我的主视图中有一个滚动视图,我的滚动视图中有三个子视图。我的所有子视图中都有 UIButtons。
现在,我想将这些按钮从一个子视图拖动到另一个子视图(拖动按钮时,滚动视图不应滚动)。
我该怎么做?
【问题讨论】:
标签: iphone objective-c ios
我的主视图中有一个滚动视图,我的滚动视图中有三个子视图。我的所有子视图中都有 UIButtons。
现在,我想将这些按钮从一个子视图拖动到另一个子视图(拖动按钮时,滚动视图不应滚动)。
我该怎么做?
【问题讨论】:
标签: iphone objective-c ios
我不完全确定这个 sn-p 是否适用于这种特殊情况(UIScrollView 中的 UIControl),但我对 UIResponder 链的理解表明它应该:)
- (void)viewDidLoad { // or wherever you initialize your things
...
// Add swipe event to UIButton so it will capture swipe intents
UIPanGestureRecognizer *panGR = [[UIPanGestureRecognizer alloc] init];
[panGR addTarget:self action:@selector(panEvent:)];
[button addGestureRecognizer:panGR];
[panGR release];
}
- (void)panEvent:(id)sender {
button.center = [sender locationInView:self.view];
}
如果这有效(现在无法测试,但在类似情况下它确实对我有效),那么您应该添加更多代码来处理拖放相关事件(可能禁用 UIScrollView 中的 Clip Subviews 选项, 如果位置与目的地的 CGRect 相交,则将按钮添加到新的超级视图,如果不相交,则将按钮返回到原始位置,等等)。
那么,这些行中发生了什么?当您开始触摸 UIButton 时,订单不会到达 UIScrollView,因为该事件可以作为触摸事件(由 UIButton 处理)或作为平移事件(由 UIScrollView 处理)跟随。当您移动手指时,UIButton 的响应者会解除该事件,因为没有Gesture Recognizer 知道如果手指移动了如何继续。
但是当你向 UIButton 添加手势识别器时,它实际上知道当手指移动时要做什么,一切都不同了:UIButton 不会关闭事件,并且 UIScrollView 永远不会意识到有触摸移动它。
我希望我的解释足够准确和易于理解。如果 a) 它不起作用或 b) 有什么不清楚的地方,请告诉我。
祝你好运:)
【讨论】:
Try
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if (allowAppDrag && [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
return NO;
}
return YES;
}
【讨论】: