2011-01-27 10 views
5

Ho una sottoclasse UIView che voglio poter spostare all'interno della sua superview. Quando l'utente tocca l'UIView da qualche parte fuori dallo self.center ma entro self.bounds "salta" perché aggiungo la nuova posizione a self.center per raggiungere lo spostamento effettivo. Per evitare questo comportamento, sto cercando di impostare un punto di ancoraggio che consenta all'utente di afferrare e trascinare la vista in qualsiasi punto all'interno dei suoi limiti.Impostazione del punto di ancoraggio per il livello UIView

Il mio problema è che quando calcolo il nuovo punto di ancoraggio (come mostrato nel codice seguente) non accade nulla, la vista non cambia affatto posizione. D'altra parte, se imposto il punto di ancoraggio su un punto precalcolato, posso spostare la vista (ma poi ovviamente "salta" al punto precalcolato). Come mai questo non funziona come previsto?

Grazie.

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // Only support single touches, anyObject retrieves only one touch 
    UITouch *touch = [touches anyObject]; 
    CGPoint locationInView = [touch locationInView:self]; 

    // New location is somewhere within the superview 
    CGPoint locationInSuperview = [touch locationInView:self.superview]; 

    // Set an anchorpoint that acts as starting point for the move 
    // Doesn't work! 
    self.layer.anchorPoint = CGPointMake(locationInView.x/self.bounds.size.width, locationInView.y/self.bounds.size.height); 
    // Does work! 
    self.layer.anchorPoint = CGPointMake(0.01, 0.0181818); 

    // Move to new location 
    self.center = locationInSuperview; 
} 
+1

assicurati di avere piena conoscenza di anchorPoint: http://stackoverflow.com/a/22188420/550393 – 2cupsOfTech

risposta

12

Come ha sottolineato Kris Van Bael, è necessario eseguire i calcoli del punto di ancoraggio nel metodo touchsBegan:withEvent: per non annullare il movimento. Inoltre, poiché la modifica del livello anchorPoint sposta la posizione iniziale della vista, è necessario aggiungere un offset al punto center della vista per evitare un "salto" dopo il primo tocco.

È possibile farlo calcolando (e aggiungendo al punto center del vostro vista) l'offset in base alla differenza tra le anchorPoints iniziali e finali (moltiplicato per larghezza/altezza del vostro vista) o si può impostare il center vista l'iniziale punto di contatto.

Qualcosa di simile, forse:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 
    CGPoint locationInView = [touch locationInView:self]; 
    CGPoint locationInSuperview = [touch locationInView:self.superview]; 

    self.layer.anchorPoint = CGPointMake(locationInView.x/self.frame.size.width, locationInView.y/self.frame.size.height); 
    self.center = locationInSuperview; 
} 

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

    UITouch *touch = [touches anyObject]; 
    CGPoint locationInSuperview = [touch locationInView:self.superview]; 

    self.center = locationInSuperview; 
} 

Maggiori informazioni anchorPoint 's da documenti di Apple here e una domanda simile SO ho fatto riferimento here.

0

È necessario aggiornare il punto di ancoraggio solo su TouchBegin. Se lo ricalcoli continuamente (TouchMoved), è logico che la visualizzazione secondaria non si sposti.

+0

Grazie, ovviamente hai ragione! Inoltre, non vi è ovviamente alcun punto nel ricalcolare il punto di ancoraggio poiché l'utente non muoverà il dito entro i limiti quando inizia la mossa effettiva. Cambiare l'aggiornamento di anchorPoint a touhesBegan ha tuttavia sollevato un problema di offset, come Sam evidenzia nella sua risposta. – Oskar

Problemi correlati