Arraste UIView (imagem e texto)

É possível arrastar o UIView pela canvas do iOS enquanto ele tem imagem e texto? por exemplo, cartões pequenos. Você poderia me apontar para o tópico semelhante (resolvido)? Eu não encontrei nenhum.

Embora o UIView não tenha um suporte interno para se mover ao longo do usuário arrastando, não deve ser tão difícil implementá-lo. É ainda mais fácil quando você está lidando apenas com o arrastamento da exibição e não com outras ações, como tocar, tocar duas vezes, tocar vários, etc.

A primeira coisa a fazer é criar uma exibição personalizada, digamos, DraggableView , subclassificando o UIView. Em seguida, substitua os touchesMoved:withEvent: de touchesMoved:withEvent: method, e você poderá obter um local de arrastamento atual e mover o DraggableView. Veja o exemplo a seguir.

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

E porque todas as subvisualizações do object DraggableView também serão movidas. Portanto, coloque todas as suas imagens e textos como subvisualizações do object DraggableView.

O que implementei aqui é muito simples. No entanto, se você quiser comportamentos mais complexos para arrastar (por exemplo, o usuário tem que tocar na visualização por alguns segundos para mover a visualização), você terá que replace outros methods de manipulação de events (touchesBegan: withEvent: e toquesEnd: withEvent) também.

Isto é o que uma solução limpa, baseada na resposta do pepouze, se pareceria ( testada, funciona! )

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

Uma adição à resposta do MHC .

Se você não quiser que o canto superior esquerdo da visualização salte por baixo do seu dedo, também é possível replace touchesBegan assim:

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

e mude os toques do MHCMovido para:

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

você também deve definir CGPoint offset na interface:

 @interface DraggableView : UIView { CGPoint offset; } 

EDITAR:

Arie Litovsky fornece uma solução mais elegante que lhe permite abandonar o ivar: https://stackoverflow.com/a/10378382/653513

Mesmo que a solução rokjarc funcione, use

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

evita a criação do CGPoint offset e a chamada para touchesBegan:withEvent:

Aqui está uma solução para arrastar um UIView personalizado (ele pode ser dimensionado ou girado através de sua transform ), que pode conter imagens e / ou texto (basta editar o Tile.xib conforme necessário):

captura de tela do aplicativo

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

Esse trabalho pra mim. Meu UIView girou e escalou

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

}