2015-07-28 5 views

risposta

14

Se avete solo bisogno di una progressbar si può semplicemente aggiungere come una visualizzazione secondaria come segue:

// Just create your alert as usual: 
let alertView = UIAlertController(title: "Please wait", message: "Need to download some files.", preferredStyle: .Alert) 
alertView.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) 

// Show it to your users 
presentViewController(alertView, animated: true, completion: { 
    // Add your progressbar after alert is shown (and measured) 
    let margin:CGFloat = 8.0 
    let rect = CGRectMake(margin, 72.0, alertView.view.frame.width - margin * 2.0 , 2.0) 
    let progressView = UIProgressView(frame: rect) 
    progressView.progress = 0.5 
    progressView.tintColor = UIColor.blueColor() 
    alertView.view.addSubview(progressView) 
}) 

E 'abbastanza difficile per ridimensionare la UIAlertController per i contenuti più grande, ma per un progressbar questo dovrebbe fare il trucco.

+0

Come si aggiorna il progresso? –

+2

Puoi semplicemente cambiare "progressView.progress". Potrebbe essere più chiaro definire "var progressView: UIProgressView?" all'esterno (non nel blocco di completamento) come facoltativo e quindi impostare "progressView? .progress = 0.123". – coyer

+0

perché usi le costanti? questo ottiene solo risultati visivi diversi su iPhone e iPad. In realtà, sembra solo buono in iPhone ritratto perché in landscape la progressview sembra spostata – Ricardo

3
func downloadAlert() { 
     let alertController = UIAlertController(title: "Title", message: "Loading...", preferredStyle: .Alert) 

     let progressDownload : UIProgressView = UIProgressView(progressViewStyle: .Default) 

     progressDownload.setProgress(5.0/10.0, animated: true) 
     progressDownload.frame = CGRect(x: 10, y: 70, width: 250, height: 0) 

    alertController.view.addSubview(progressDownload) 
    presentViewController(alertController, animated: true, completion: nil) 
} 
+0

Corro l'app e ottenuto questo errore *** Termina l'applicazione a causa dell'eccezione non rilevata 'NSInternalInconsistencyException', motivo: 'Impossibile determinare la direzione di navigazione per lo scorrimento' *** Primo stack di chiamate throw: –

4

le mie scuse, ragazzi, per l'utilizzo di Objective C, in questa soluzione, ma ho pensato che potrebbe aiutare gli altri, che non utilizzano ancora Swift. E, probabilmente, puoi convertirlo abbastanza facilmente in Swift. È più la metodologia che volevo evidenziare.

Non sono sicuro se Apple potrebbe rifiutare questa soluzione, ma qui va comunque.

Apple afferma che da iOS7 in poi UIAlertView non dovrebbe essere sottoclasse. La gerarchia vista per questa classe è privato e non deve essere modificato:

https://developer.apple.com/reference/uikit/uialertview?language=objc

In altre parole, l'aggiunta di un UIView a un UIAlertView non ha assolutamente alcun effetto.

Tuttavia, ho una soluzione che comporta l'aggiunta di UIProgressView sopra UIAlertView, ma aggiungendo il primo alla finestra dell'app. Utilizzando l'UIView superview.center proprietà, e alcuni piccoli aggiustamenti, il desiderato effetto può essere ottenuto:

-(void)addProgressBar{ 
    float width = 232; 
    float height = 5; 
    self.progbar = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault]; 
    self.progbar.backgroundColor = [UIColor colorWithWhite:0.75f alpha:1.0f]; 
    [self.progbar setFrame:CGRectMake(0,0,width,height)]; 
    [self.progbar setTrackTintColor:[UIColor colorWithWhite:0.75f alpha:1.0f]]; 
    [self.progbar setProgressTintColor:[UIColor colorWithRed:21.0f/255.0f green:126.0f/255.0f blue:251.0f/255.0f alpha:1.0f]]; 
    self.progbar.alpha = 0.0; 
    [[UIApplication sharedApplication].keyWindow addSubview:self.progbar]; 
    self.progbar.center = self.progbar.superview.center; 
    [self.progbar setFrame:CGRectMake(self.progbar.frame.origin.x,self.progbar.frame.origin.y+10,self.progbar.frame.size.width,self.progbar.frame.size.height)]; 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:2.0]; 
    [self.progbar setAlpha:1.0]; 
    [UIView commitAnimations]; 
} 

aggiungo il fade in, per permettere al UIAlertView di apparire completamente prima. Quindi aggiungere alcune altre funzioni di delegato per respingere l'UIProgressView, nei momenti giusti:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    if(self.alert.cancelButtonIndex == buttonIndex){ 
     [self.progbar removeFromSuperview]; 
    } 
} 

- (void)alertViewCancel:(UIAlertView *)alertView{ 
    [self.progbar removeFromSuperview]; 
} 

enter image description here

+0

può scrivere qui i codici swift per favore? –

+0

@SaeedRahmatolahi Scusa, Saeed, temo di essere una vecchia scuola. So solo l'obiettivo c, quindi non posso convertirlo per te ... –

+0

:(ok grazie per aver letto la mia domanda –