2013-04-13 2 views
0

У меня на экране есть много UIbuttons, и я хочу, чтобы пользователь мог перемещать кнопки, нажимая и удерживая их, а затем перетаскивая их. Я пришел с этим кодом:Перемещение 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"];*/ 

} 
} 

Единственная проблема заключается в том, что я не знаю, как определить, какая кнопка была нажата, чтобы переместить его. Есть идеи??

+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

+0

отличная книга, я пойду для распознавателя таргетинга – Alessandro

Смежные вопросы