Jos*_*el. 5 iphone xcode drag-and-drop objective-c
我试图拖动一个图像,让它在释放后返回原来的位置.到目前为止,我可以使用以下代码将其创建为按钮来拖动图像:(在此问题的答案中可以看到:iOS中的基本拖放)
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self action:@selector(imageTouch:withEvent:) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside];
[button setImage:[UIImage imageNamed:@"vehicle.png"] forState:UIControlStateNormal];
[self.view addSubview:button];
Run Code Online (Sandbox Code Playgroud)
后来我定义:
- (IBAction) imageMoved:(id) sender withEvent:(UIEvent *) event
{
CGPoint point = [[[event allTouches] anyObject] locationInView:self.view];
UIControl *control = sender;
control.center = point;
}
Run Code Online (Sandbox Code Playgroud)
如何在释放后将其恢复到原始位置?对于初学者我会保存每个图像应该返回的位置,但是,无论如何,无论如何都要指示UIImage从它的当前位置移动并移动到另一个?或任何其他替代解决方案?
Apple推荐UIGestureRecognizer用于最近的iOS.你不仅可以将它用于UIButton,还可以用于UIView(尤其是你的UIImageView)等等.所以我想推荐它.
在界面中:
@interface TestDragViewController : UIViewController {
IBOutlet UIImageView *dragImage;
CGPoint originalCenter;
}
Run Code Online (Sandbox Code Playgroud)
在viewDidLoad中,plz记得启用userInteraction:
- (void)viewDidLoad {
[super viewDidLoad];
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self
action:@selector(dragGesture:)];
[dragImage addGestureRecognizer:panGesture];
[dragImage setUserInteractionEnabled:YES];
}
Run Code Online (Sandbox Code Playgroud)
在它的选择器中,我只是设置动画来可视化返回的效果:
#pragma mark -
#pragma mark UIPanGestureRecognizer selector
- (void) dragGesture:(UIPanGestureRecognizer *) panGesture{
CGPoint translation = [panGesture translationInView:self.view];
switch (panGesture.state) {
case UIGestureRecognizerStateBegan:{
originalCenter = dragImage.center;
}
break;
case UIGestureRecognizerStateChanged:{
dragImage.center = CGPointMake(dragImage.center.x + translation.x,
dragImage.center.y + translation.y);
}
break;
case UIGestureRecognizerStateEnded:{
[UIView animateWithDuration:kImageReturnTime
animations:^{
dragImage.center = originalCenter;
}
completion:^(BOOL finished){
NSLog(@"Returned");
}];
}
break;
default:
break;
}
[panGesture setTranslation:CGPointZero inView:self.view];
}
Run Code Online (Sandbox Code Playgroud)
干杯,
汤米
Hwe*_*Yar -1
你知道吗,我昨天刚刚在做这个,所以这里有一些额外的动画:
- (void)previewImageTouchUpInside:(UIButton*)aButton {
if (!previewImageDragged) {
[self selectPreviewImage:aButton];
return;
}
previewImageDragged = NO;
// If user drag photo a little and then release, we'll still treat it as a tap
// instead of drag
if ((originalPositionOfButton.x - aButton.center.x) *
(originalPositionOfButton.x - aButton.center.x) +
(originalPositionOfButton.y - aButton.center.y) *
(originalPositionOfButton.y - aButton.center.y) < 10) {
aButton.center = originalPositionOfButton;
[self selectPreviewImage:aButton];
return;
}
[UIView animateWithDuration:0.5
delay:0
options:UIViewAnimationOptionCurveEaseOut |
UIViewAnimationOptionAllowUserInteraction animations:^{
aButton.center = originalPositionOfButton;
} completion:nil];
}
- (void)previewImageDraggedInside:(UIButton*)aButton event:(UIEvent*)event {
if (!previewImageDragged) {
originalPositionOfButton = aButton.center;
[self.view bringSubviewToFront:aButton];
[self.view bringSubviewToFront:[self.view viewWithTag:CHOOSE_PHOTO_BUTTON_TAG]];
}
UITouch* touch = [[event allTouches] anyObject];
previewImageDragged = YES;
aButton.center = CGPointMake(aButton.center.x+[touch locationInView:self.view].x-
[touch previousLocationInView:self.view].x,
aButton.center.y+[touch locationInView:self.view].y-
[touch previousLocationInView:self.view].y);
}
Run Code Online (Sandbox Code Playgroud)
它仍然有一些神奇的数字,我没有重命名函数和变量以适合您的示例,但它应该很清楚。我还在这里进行了缩进,因为我不会手动断开代码中的长行。