我有一个UIButton,我希望用户能够使用TouchDragInside进行拖动。当用户移动手指时,如何让按钮移动?
答案 0 :(得分:13)
正如Jamie所说,平移手势识别器可能就是这样。代码看起来如下所示。
按钮的视图控制器可能会向按钮添加手势识别器(可能在viewDidLoad
中),如下所示:
UIPanGestureRecognizer *pangr = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
[myButton addGestureRecognizer:pangr];
[pangr release];
并且,视图控制器将具有以下目标方法来处理手势:
- (void)pan:(UIPanGestureRecognizer *)recognizer
{
if (recognizer.state == UIGestureRecognizerStateChanged ||
recognizer.state == UIGestureRecognizerStateEnded) {
UIView *draggedButton = recognizer.view;
CGPoint translation = [recognizer translationInView:self.view];
CGRect newButtonFrame = draggedButton.frame;
newButtonFrame.origin.x += translation.x;
newButtonFrame.origin.y += translation.y;
draggedButton.frame = newButtonFrame;
[recognizer setTranslation:CGPointZero inView:self.view];
}
}
根据rohan-patel的评论进行修正。
在之前发布的代码中,直接设置了按钮框架原点的x和y坐标。这是不正确的:draggedButton.frame.origin.x += translation.x
。可以更改视图的框架,但不能直接更改框架的组件。
答案 1 :(得分:6)
您可能不想使用TouchDragInside。这是一种识别按钮或其他控件已经以某种方式被激活的方法。要移动按钮,您可能希望使用UIPanGestureRecognizer,然后在用户手指移动时更改其超级视图中的按钮位置。
答案 2 :(得分:0)
你必须在保存按钮的视图中实现这四个方法,touchesBegan:withEvent:,touchesMoved:withEvent:,touchesEnded:withEvent:和touchesCancelled:withEvent:您引用的属性不能直接用于拖动任何uiview