5

Ho un uiview nella parte superiore dell'interfaccia (sotto la barra di stato) che viene mostrata solo la parte inferiore.Tocca e tira giù una vista

In realtà, voglio far scorrere l'utente in rosso verso il basso per essere interamente mostrato dal trascinamento come il centro di notifica in iOS nativo e non semplicemente toccando un pulsante.

Che cosa dovrei usare per "toccare e abbassare" l'uiview in modo che possa essere mostrato interamente?

Example

risposta

3

Fai una sottoclasse di UIView.

Override touchesBegan:withEvent e touchesMoved:withEvent.

Nel touchesBegan forse apportare una modifica visiva in modo che l'utente sappia che stanno toccando la vista. Nel touchesMoved utilizzare [[touches anyObject] locationInView:self] e [[touches anyObject] previousLocationInView:self]

per calcolare la differenza tra la posizione tocco attuale e la posizione ultimo tocco (rilevare trascinare verso il basso o trascinare il backup).

Quindi, se si sta disegnando su misura, chiamare [self setNeedsDisplay] per indicare alla vista di ridisegnare nel metodo drawRect:(CGRect)rect.

Nota: questo presuppone che il tocco multiplo non venga utilizzato da questa vista.

1

Fare riferimento alla mia risposta in iPhone App: implementation of Drag and drop images in UIView

Hai solo bisogno di usare TouchesBegin e TouchesEnded metodi. In questo esempio, ho mostrato come utilizzare CGPoint, invece di provare a utilizzare setFrame o drawRect per la visualizzazione.

Appena TouchesMoved metodo viene chiamato è necessario utilizzare setFrame o drawRect (non sono sicuro, ma che funziona sempre, per lo più SETFRAME) anche prendere l'altezza da CGPoint.

+0

Will - (void) pan: (UIPanGestureRecognizer *) il gesto esegue il lavoro? – Alby

+1

Sì, ma devi essere più attento mentre lo usi ...come è necessario definire il controllo corretto e altre cose ... Va bene anche ... ma se stai usando Touchesbegin e TouchesEnded ... allora puoi semplicemente dare IBOutlets in Interface Builder ... – DShah

9

Non è necessario trovare una soluzione alternativa di trascinamento della selezione. Un UIScrollView può farlo senza alcuna perdita di prestazioni causata dall'ascolto di tocchi.

pulldown

@interface PulldownView : UIScrollView 

@end 

@implementation PulldownView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (!self) { 
     return self; 
    } 
    self.pagingEnabled = YES; 
    self.bounces = NO; 
    self.showsVerticalScrollIndicator = NO; 
    [self setBackgroundColor:[UIColor clearColor]]; 
    double pixelsOutside = 20;// How many pixels left outside. 
    self.contentSize = CGSizeMake(320, frame.size.height * 2 - pixelsOutside); 
    // redArea is the draggable area in red. 
    UIView *redArea = [[UIView alloc] initWithFrame:frame]; 
    redArea.backgroundColor = [UIColor redColor]; 
    [self addSubview:redArea]; 
    return self; 
} 

// What this method does is to make sure that the user can only drag the view from inside the area in red. 
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if (point.y > height) 
    { 
     // Leaving useless touches to the views under it. 
     return nil; 
    } 
    return [super hitTest:point withEvent:event]; 
} 

@end 

Come si usa:
1. Inizializza un'istanza di PulldownView.
2. Aggiungere qualsiasi contenuto che si desidera visualizzare all'istanza usando [addSubview:].
3. Nascondere l'area in rosso.

[pulldownView setContentOffset:CGPointMake(0, heightOfTheView - pixelsOutside)]; 

Questo è un semplice esempio. È possibile aggiungere qualsiasi funzionalità ad esso come aggiungere una barra dei pulsanti titolata nella parte inferiore dell'area trascinabile per implementare il click-n-drop o aggiungere un metodo all'interfaccia per riposizionarlo dal chiamante.

+0

Questo è fantastico, esattamente cosa Avevo bisogno. Grazie! – bcattle

Problemi correlati