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

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

}
}


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

最佳答案

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

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拖动对象:

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

10-08 08:06