4

Я разрабатываю простую анимацию где, по UIImageView движется по UIBezierPath, теперь я хочу, чтобы предоставить пользователю Интерактивного к движущемуся UIImageView, так что пользователь может направлять UIImageView коснувшись UIImageView и сопротивление UIImageview вокруг экрана.iPhone - Переместить объект по сенсорным и перетащить путь

+0

сэр У меня такая же проблема, как у вас есть, пожалуйста, помогите мне, если вы сделаете эту вещь. –

ответ

5

Таким образом, вы хотите, чтобы пользователь мог коснуться изображения в середине анимации ключевого кадра вдоль изогнутого пути и перетащить его в другое место? Что вы хотите сделать с анимацией в этот момент?

У вас есть несколько задач.

Сначала обнаруживается прикосновение к объекту, в то время как анимация ключевого кадра «находится в полете».

Для этого вы хотите использовать метод hitTest слоя представления слоя родительского представления.

Уровень представления слоя представляет собой состояние слоя в любой момент времени, включая анимацию.

Как только вы обнаружите штрихи на своем представлении, вам нужно будет получить текущее местоположение изображения с уровня презентации, остановить анимацию и перенести с помощью анимации touchsMoved/touchhesDragged.

Я написал демонстрационное приложение, которое показывает, как обнаружить касания объекта, который анимируется вдоль пути. Это будет хорошей отправной точкой.

Посмотрите здесь:

Core Animation demo including detecting touches on a view while an animation is "in flight".

9

Измените рамку с изображением в touchesMoved:withEvent:.

Edit: Некоторый код

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    UITouch *touch = [[event allTouches] anyObject]; 
    if ([touch.view isEqual: self.view] || touch.view == nil) { 
     return; 
    } 

    lastLocation = [touch locationInView: self.view]; 
} 

- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { 
    UITouch *touch = [[event allTouches] anyObject]; 
    if ([touch.view isEqual: self.view]) { 
     return; 
    } 

    CGPoint location = [touch locationInView: self.view]; 

    CGFloat xDisplacement = location.x - lastLocation.x; 
    CGFloat yDisplacement = location.y - lastLocation.y; 

    CGRect frame = touch.view.frame; 
    frame.origin.x += xDisplacement; 
    frame.origin.y += yDisplacement; 
    touch.view.frame = frame; 
    lastLocation=location; 
} 

Вы должны также осуществлять touchesEnded:withEvent: и touchesCanceled:withEvent:.

+0

Хорошо, но как распознать прикосновение к конкретному объекту? – Pete

+0

Объекты в наборе 'touchhes', которые вы получаете в этом методе, являются UITouches, и поэтому они имеют свойство' view', которое представляет собой представление, в котором первоначально произошло касание. – dasdom

+0

Возможно ли вам поделиться небольшим фрагментом кода? – Pete

1

Самый простой способ - это подклассы UIImageView.

Для простого перетаскивания взглянуть на код здесь (код заимствованные из пользователя MHC):

UIView drag (image and text)

Так как вы хотите, чтобы перетащить на пути Безье вам придется изменить touchesMoved:

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

     UITouch *aTouch = [touches anyObject]; 

     //here you have location of user's finger 
     CGPoint location = [aTouch locationInView:self.superview]; 

     [UIView beginAnimations:@"Dragging A DraggableView" context:nil]; 

     //commented code would simply move the view to that point 
     //self.frame = CGRectMake(location.x-offset.x,location.y-offset.y,self.frame.size.width, self.frame.size.height); 

     //you need some kind of a function 
     CGPoint calculatedPosition = [self calculatePositonForPoint: location]; 

     self.frame = CGRectMake(calculatedPosition.x,calculatedPosition.y,self.frame.size.width, self.frame.size.height); 

     [UIView commitAnimations]; 
    } 

Что именно вы хотели бы сделать в -(CGPoint) calculatePositionForPoint:(CGPoint)location зависит от вас. Например, вы можете вычислить точку в пути Безье, которая наиболее близка к location. Для простого теста вы можете сделать:

-(CGPoint) calculatePositionForPoint:(CGPoint)location { 

    return location; 
} 

По пути тебе придется решить, что произойдет, если пользователь чудеса от далеко от вашего расчетном пути Безье.

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