Перемещение UIView (изображение и текст)
Можно ли перетащить UIView вокруг экрана iOS, в то время как у него есть изображение и текст? например, небольшие карточки. Не могли бы вы указать мне на аналогичную (решенную) тему? Я их не нашел.
- Ошибка модуля сборки iOS8 для Facebook для FBSDKCoreKit
- objective C - Как использовать метод initWithCoder?
- Как написать данные в plist?
- Чтение образцов с помощью AVAssetReader
- Сериализация и десериализация объектов Objective-C в JSON
- Objective-c iPhone-процент кодирует строку?
- Как установить получателей для UIActivityViewController в iOS 6?
- Проблема с кодом: строка формата не является строковым литералом
В то время как 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);
}