在屏幕上移动UI按钮

时间:2013-04-13 19:06:52

标签: ios

我在屏幕上有很多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"];*/

}
}

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

1 个答案:

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

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