iPhone - перемещать объект по сенсорному экрану и перетаскивать его - PullRequest
4 голосов
/ 29 марта 2012

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

Ответы [ 3 ]

9 голосов
/ 29 марта 2012

Изменить рамку положения представления изображения в touch.Moved: withEvent: .

Редактировать: Некоторый код

- (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:.

5 голосов
/ 03 апреля 2012

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

У вас есть несколько испытаний.

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

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

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

После того, как вы обнаружите прикосновения к своему виду, вам нужно будет узнать текущее местоположение изображения из слоя презентации, остановить анимацию и использовать анимацию на основе touchesMoved / touchesDragged.

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

Взгляните сюда:

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

1 голос
/ 29 марта 2012

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

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

UIView drag (изображение и текст)

Поскольку вы хотите перетащить путь Безье, вам придется изменить 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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...