0

我在屏幕上有很多 UIbuttons,我希望用户能够通过按住它们然后拖动它们来移动按钮。我想出了这段代码:

- (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"];*/

}
}

唯一的问题是我不知道如何检测已按下哪个按钮来移动它。有任何想法吗??

4

1 回答 1

2

您可以使用命中测试。请参阅我书中的示例:

http://www.aeth.com/iOSBook/ch18.html#_hit_testing

在您的背景视图中获得了点...

CGPoint pt = [[touches anyObject] locationInView:self.view];

您现在可以点击测试该点所在的子视图(按钮)(如果有):

UIView* v = [self.view hitTest:pt withEvent:nil];

但是,我认为您整体上执行此操作的方式非常复杂。使用手势识别器可能会更开心。在我的书中,我还描述了如何使用 UIPanGestureRecognizer 来拖动对象:

http://www.aeth.com/iOSBook/ch18.html#_gesture_recognizers

于 2013-04-13T19:18:03.670 回答