我在屏幕上有很多UI按钮,我希望用户能够通过按住它们然后拖动它们来移动按钮。我想出了这段代码:
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
[[NSUserDefaults standardUserDefaults] synchronize];
[[NSNotificationCenter defaultCenter] postNotificationName:@"MoveAllViewsUpForDrag" object:self userInfo:nil];
//[self.layer removeAllAnimations];
// Retrieve the touch point
CGPoint pt = [[touches anyObject] locationInView:self.view];
startLocation = pt;
originYDraggable = self.frame.origin.y;
originXDraggable = self.frame.origin.x;
[[self superview] bringSubviewToFront:self];
[UIImageView animateWithDuration:0.5 animations:^(void) {
CGRect frame = [self frame];
frame.size.width = frame.size.width + 15;
frame.size.height = frame.size.height + 15;
[self setFrame:frame];
[self setAlpha:0.6];
}];
Draggable* sharedSingleton = [Draggable sharedManagerDraggable];
//nameOfTheMessage = sharedSingleton.namePassedToDraggable;
NSLog(@"%@, %d", sharedSingleton.namePassedToDraggableArray, self.tag);
}
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event {
// Move relative to the original touch point
CGPoint pt = [[touches anyObject] locationInView:self];
CGRect frame = [self frame];
frame.origin.x += pt.x - startLocation.x;
frame.origin.y += pt.y - startLocation.y;
[self setFrame:frame];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[[NSUserDefaults standardUserDefaults] synchronize];
[[NSNotificationCenter defaultCenter] postNotificationName:@"MoveAllViewsDownForDrag" object:self userInfo:nil];
CGRect frame = [self frame];
if (frame.origin.y < 50) {
SaveEventsOrganizer* sharedSingletonOrganizer = [SaveEventsOrganizer sharedManagerSaveEventsOrganizer];
Draggable* sharedSingletonDraggable = [Draggable sharedManagerDraggable];
NSString *string = sharedSingletonDraggable.namePassedToDraggableArray[self.tag - 1];
sharedSingletonOrganizer.NameOfEventPassedToOrganizerFromDraggable = string;
[sharedSingletonOrganizer addAnEvent];
[self removeFromSuperview];
}else{
[UIImageView animateWithDuration:0.5 animations:^(void) {
CGRect frame = [self frame];
frame.size.width = frame.size.width - 15;
frame.size.height = frame.size.height - 15;
frame.origin.x = originXDraggable;
frame.origin.y = originYDraggable;
[self setFrame:frame];
[self setAlpha:1.0];
}];
/*CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
[anim setToValue:[NSNumber numberWithFloat:0.0f]];
[anim setFromValue:[NSNumber numberWithDouble:M_PI/80]]; // rotation angle
[anim setDuration:0.1];
[anim setRepeatCount:NSUIntegerMax];
[anim setAutoreverses:YES];
[self.layer addAnimation:anim forKey:@"iconShake"];*/
}
}
唯一的问题是我不知道如何检测按下哪个按钮来移动它。任何想法??
答案 0 :(得分:2)
您可以使用点击测试。请参阅我的书中的示例:
http://www.apeth.com/iOSBook/ch18.html#_hit_testing
在你的背景视图中获得了这个点......
CGPoint pt = [[touches anyObject] locationInView:self.view];
现在,您可以点击测试该点位于的哪个子视图(按钮)(如果有):
UIView* v = [self.view hitTest:pt withEvent:nil];
但是,我认为你这样做的方式总体上过于复杂。使用手势识别器可能会更快乐。在我的书中,我还描述了如何使用UIPanGestureRecognizer来拖动对象: