Подтвердить что ты не робот

Перемещение UIView (изображение и текст)

Можно ли перетащить UIView на экран iOS, пока у него есть как изображение, так и текст? например маленькие карты. Не могли бы вы указать мне на аналогичную (решенную) тему? Я не нашел.

4b9b3361

Ответ 1

В то время как UIView не имеет встроенной поддержки для перемещения по пользовательскому перетаскиванию, ее не должно быть сложно реализовать. Это еще проще, когда вы имеете дело с перетаскиванием на просмотр, а не с другими действиями, такими как постукивание, двойное нажатие, многократное нажатие и т.д.

Первое, что нужно сделать, - создать пользовательский вид, например DraggableView, путем подкласса UIView. Затем переопределите метод UIView touchesMoved:withEvent:, и вы можете получить текущее местоположение перетаскивания и переместить DraggableView. Посмотрите на следующий пример.

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *aTouch = [touches anyObject];
    CGPoint location = [aTouch locationInView:self.superview];
    [UIView beginAnimations:@"Dragging A DraggableView" context:nil];
    self.frame = CGRectMake(location.x, location.y, 
                            self.frame.size.width, self.frame.size.height);
    [UIView commitAnimations];
}

И потому все перемещения в объекте DraggableView тоже будут перемещены. Поэтому поместите все ваши изображения и тексты в виде объектов в объекте DraggableView.

То, что я здесь сделал, очень просто. Однако, если вам нужно более сложное поведение для перетаскивания (например, пользователю нужно нажать на вид в течение нескольких секунд, чтобы переместить представление), тогда вам придется переопределить другие методы обработки событий (touchsBegan: withEvent: и касается: withEvent).

Ответ 2

Это то, на что положительное решение, основанное на ответе pepouze, будет выглядеть (проверено, оно работает!)

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *aTouch = [touches anyObject];
    CGPoint location = [aTouch locationInView:self];
    CGPoint previousLocation = [aTouch previousLocationInView:self];
    self.frame = CGRectOffset(self.frame, (location.x - previousLocation.x), (location.y - previousLocation.y));
}

Ответ 3

Добавление в ответ MHC.

Если вам не нужен верхний левый угол обзора прыгать под пальцем, вы также можете переопределить touchesBegan например:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *aTouch = [touches anyObject];

    offset = [aTouch locationInView: self];
}

и измените касание MHCMoved:

 -(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
 {
      UITouch *aTouch = [touches anyObject];
      CGPoint location = [aTouch locationInView:self.superview];

      [UIView beginAnimations:@"Dragging A DraggableView" context:nil];
      self.frame = CGRectMake(location.x-offset.x, location.y-offset.y, 
                              self.frame.size.width, self.frame.size.height);
      [UIView commitAnimations];
  }

вы также должны определить CGPoint offset в интерфейсе:

@interface DraggableView : UIView
{
    CGPoint offset;
}

EDIT:

Arie Litovsky предлагает более элегантное решение, которое позволяет вам канаву ivar: fooobar.com/questions/191655/...

Ответ 4

Несмотря на то, что решение rokjarc работает, используя

CGPoint previousLocation = [aTouch previousLocationInView:self.superview];

избегает создания CGPoint offset и вызов touchesBegan:withEvent:

Ответ 5

Вот решение перетащить пользовательский UIView (его можно масштабировать или поворачивать по его transform), который может содержать изображения и/или текст (просто отредактируйте Tile.xib по мере необходимости):

app screenshot

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self];
    CGPoint previous = [touch previousLocationInView:self];

    if (!CGAffineTransformIsIdentity(self.transform)) {
        location = CGPointApplyAffineTransform(location, self.transform);
        previous = CGPointApplyAffineTransform(previous, self.transform);
    }

    self.frame = CGRectOffset(self.frame,
                              (location.x - previous.x),
                              (location.y - previous.y));
}

Ответ 6

Эта работа для меня. Мой UIView повернут и масштабируется

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

UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:self];
CGPoint previous = [touch previousLocationInView:self];

if (!CGAffineTransformIsIdentity(self.transform)) {
    location = CGPointApplyAffineTransform(location, self.transform);
    previous = CGPointApplyAffineTransform(previous, self.transform);
}
CGRect newFrame = CGRectOffset(self.frame,
                               (location.x - previous.x),
                               (location.y - previous.y));
float x = CGRectGetMidX(newFrame);
float y = CGRectGetMidY(newFrame);
self.center = CGPointMake(x, y);

}