Можно ли перетащить UIView на экран iOS, пока у него есть как изображение, так и текст? например маленькие карты. Не могли бы вы указать мне на аналогичную (решенную) тему? Я не нашел.
Перемещение UIView (изображение и текст)
Ответ 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
по мере необходимости):
- (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);
}