2015-07-28 26 views
8

Hızlı iOS 8 UIAlertController uygulamasında ilerleme çubuğu eklemek istiyorum. Mümkün mü? UIAlertController'ı alt sınıflara ayırmak ve progres çubuğu eklemek ve bazı delege işlevlerini bağlamak için herhangi bir yol var mı?UIAlertController'a ilerleme çubuğu nasıl eklenir?

sayesinde

cevap

14

sadece bir progressbar gerekiyorsa aşağıdaki gibi sadece bir subview ekleyebilirsiniz:

// 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) 
}) 

Daha büyük içerik için ama bunu yapmak gereken bir progressbar için UIAlertController yeniden boyutlandırmak için oldukça zor Numara.

+0

nasıl ilerleme güncellerim? –

+2

"progressView.progress" öğesini basitçe değiştirebilirsiniz. "Var progressView: UIProgressView?" Ifadesini tanımlamak daha net olabilir. dışında (tamamlanma bloğunda değil) isteğe bağlı olarak ve sonra "progressView? .progress = 0.123" olarak ayarlayın. – coyer

+0

neden sabit kullanıyorsunuz? Bu sadece iPhone ve iPad'de farklı görsel sonuçlar alır. Aslında, sadece iPhone portre iyi görünüyor çünkü manzarada ilerleme görüşü değişti – 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

Uygulamayı çalıştırıyorum ve bu hatayı aldım *** Yakalanmamış istisna 'NSInternalInconsistencyException' nedeniyle uygulamayı sonlandırma, nedeni: 'Kaydırmak için navigasyon yönünü belirleyemedi' *** İlk atma çağrı yığını: –

4

Özür dilerim, çocuklar, bu çözümde objektif c'yi kullanmak için, ama Swift'i kullanmayan başkalarına yardımcı olabileceğini düşündüm. Ve ayrıca, bunu oldukça kolayca Swift'e dönüştürebilirsiniz. Vurgulamak istediğim metodoloji daha fazla.

Ayrıca Apple'ın bu çözümü reddedip reddedemeyeceğinden emin değilim, ancak yine de gider.

Apple, iOS7'den itibaren UIAlertView'ın alt sınıflara ayrılmaması gerektiğini bildiriyor. Bu sınıf için görünüm hiyerarşi özeldir ve değiştirilemez gerekir: Bir başka deyişle

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

, kesinlikle hiçbir etkisi yoktur bir UIAlertView bir UIView ekledi. Ancak, UIProgressView'ı UIAlertView'ın üzerine eklemek, ancak eski uygulama penceresine eklemek de dahil olmak üzere bir çözüme sahibim. UIView superview.center özelliğini kullanarak ve bazı küçük düzenlemeler, istenen etkiler elde edilebilir:

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

ben UIAlertView tamamen birinci görünmesine izin vermek için, fade ekleyebilir. Sonra doğru anlarda, UIProgressView görevden başka temsilci işlevleri ekleyin:

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

buradan hızlı kodları yazabilir misiniz? –

+0

@SaeedRahmatolahi Üzgünüm, Saeed, korkarım ben eski skool'um. Sadece nesnel c biliyorum, bu yüzden sizin için dönüştüremiyorum ... –

+0

:(ok sorumu okumak için teşekkürler –