<分区>
我有一个 UILabel,我在其中添加了一个平移手势识别器,我的 View 上还有一个使用 UIImage View 的垃圾桶图像。每次将 UILabel 拖到垃圾桶图像时,我都想从我的程序 View 中删除 UILabel。
<分区>
我有一个 UILabel,我在其中添加了一个平移手势识别器,我的 View 上还有一个使用 UIImage View 的垃圾桶图像。每次将 UILabel 拖到垃圾桶图像时,我都想从我的程序 View 中删除 UILabel。
最佳答案
我假设你想做这样的事情:
我将向您展示如何实现它。
我们需要一个用于标签的导出和一个用于垃圾桶 View 的导出:
@interface ViewController ()
@property (strong, nonatomic) IBOutlet UIImageView *trashView;
@property (strong, nonatomic) IBOutlet UILabel *label;
@end
将它们连接到您的标签和垃圾桶 View 。我们还需要两个实例变量:
@implementation ViewController {
CGPoint labelOriginalCenter;
BOOL trashIsShowingPendingDropAppearance;
}
我们需要保存标签的原始位置,这样如果取消拖动我们可以将其动画放回原处:
- (void)viewDidLoad {
[super viewDidLoad];
labelOriginalCenter = self.label.center;
}
现在让我们为平移手势识别器执行操作。我们需要根据手势移动标签。然后我们需要根据手势的状态采取行动。
- (IBAction)labelWasDragged:(UIPanGestureRecognizer *)recognizer {
[self moveLabelForDrag:recognizer];
switch (recognizer.state) {
case UIGestureRecognizerStateChanged:
[self labelDragDidChange:recognizer];
break;
case UIGestureRecognizerStateEnded:
[self labelDragDidEnd:recognizer];
break;
case UIGestureRecognizerStateCancelled:
[self labelDragDidAbort:recognizer];
break;
default:
break;
}
}
为了移动标签,我们通过手势的平移来改变它的中心。我们还会在每次更改时将手势的转换重置为零。
- (void)moveLabelForDrag:(UIPanGestureRecognizer *)sender {
CGPoint translation = [sender translationInView:self.label];
[sender setTranslation:CGPointZero inView:self.label];
CGPoint center = self.label.center;
center.x += translation.x;
center.y += translation.y;
self.label.center = center;
}
如果手势改变了,我们想根据触摸是否在垃圾桶上方来更新垃圾桶的外观:
- (void)labelDragDidChange:(UIPanGestureRecognizer *)recognizer {
if ([self dragIsOverTrash:recognizer]) {
[self updateTrashAppearanceForPendingDrop];
} else {
[self updateTrashAppearanceForNoPendingDrop];
}
}
如果手势结束,我们希望根据手势结束时触摸是否在垃圾桶上方来丢弃标签或中止拖动:
- (void)labelDragDidEnd:(UIPanGestureRecognizer *)recognizer {
if ([self dragIsOverTrash:recognizer]) {
[self dropLabelInTrash];
} else {
[self abortLabelDrag];
}
}
如果手势被取消,我们要中止拖动:
- (void)labelDragDidAbort:(UIPanGestureRecognizer *)recognizer {
[self abortLabelDrag];
}
为了检测手势的触摸是否在垃圾桶上方,我们向手势识别器询问它在垃圾 View 坐标系中的位置。然后我们询问垃圾 View 该位置是否在垃圾 View 的边界内。
- (BOOL)dragIsOverTrash:(UIPanGestureRecognizer *)recognizer {
CGPoint pointInTrash = [recognizer locationInView:self.trashView];
return [self.trashView pointInside:pointInTrash withEvent:nil];
}
我们可以通过多种不同的方式更新垃圾桶的外观。在这里,我们将在拖动垃圾桶时让垃圾桶摆动:
- (void)updateTrashAppearanceForPendingDrop {
if (trashIsShowingPendingDropAppearance)
return;
trashIsShowingPendingDropAppearance = YES;
self.trashView.transform = CGAffineTransformMakeRotation(-.1);
[UIView animateWithDuration:0.15 delay:0 options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat animations:^{
self.trashView.transform = CGAffineTransformMakeRotation(.1);
} completion:nil];
}
当拖动离开垃圾桶时,我们需要让垃圾桶停止摆动:
- (void)updateTrashAppearanceForNoPendingDrop {
if (!trashIsShowingPendingDropAppearance)
return;
trashIsShowingPendingDropAppearance = NO;
[UIView animateWithDuration:0.15 animations:^{
self.trashView.transform = CGAffineTransformIdentity;
}];
}
当我们想要将标签放入垃圾箱时,我们需要做几件事。我们需要停止垃圾桶摆动,我们需要将标签放入垃圾桶的动画,当动画结束时,我们需要完全移除标签。
- (void)dropLabelInTrash {
[self updateTrashAppearanceForNoPendingDrop];
[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
self.label.center = self.trashView.center;
self.label.transform = CGAffineTransformMakeScale(0.1, 0.1);
} completion:^(BOOL finished) {
[self.label removeFromSuperview];
self.label = nil;
}];
}
如果拖动被中止,我们需要停止垃圾桶的摆动并使标签动画回到其原始位置:
- (void)abortLabelDrag {
[self updateTrashAppearanceForNoPendingDrop];
[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
self.label.center = labelOriginalCenter;
} completion:nil];
}
就是这样!
关于ios - 拖动到图像时删除 UILabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17765792/