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

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

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

Первое, что нужно сделать, это сделать пользовательское представление, скажем DraggableView , путем подclassа UIView. Затем переопределите метод UIViewMoved 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).

Это то, на что положительное решение, основанное на ответе 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)); } 

Добавление к ответу 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; } 

РЕДАКТИРОВАТЬ:

Arie Litovsky предлагает более элегантное решение, позволяющее вам канаву ivar: https://stackoverflow.com/a/10378382/653513

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

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

избегает CGPoint offset и вызова touchesBegan:withEvent:

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

скриншот приложения

 - (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)); } 

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

 - (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); } 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); 

}

  • Воспроизведение музыки в фоновом режиме с помощью AVAudioplayer
  • Обнаружение интернет-соединения iPhone SDK
  • COMET (серверный клик для клиента) на iPhone
  • Перетаскивание UIView внутри UIScrollView
  • Как скопировать объект в объекте c
  • как правильно использовать insertRowsAtIndexPaths?
  • Как предоставить пространство между двумя ячейками в виде таблицы?
  • Как resize NSImage
  • Взаимодействие за пределами UIView
  • Как добавить gradleиент к тексту UILabel, но не к фону?
  • Рисование формы волны с помощью AVAssetReader
  • Давайте будем гением компьютера.