Я хочу добавить индикатор выполнения в быстрый iOS 8 UIAlertController. Это возможно? Есть ли способ подкласса UIAlertController и добавить панель progres и подключить некоторые функции делегата?
спасибо
Я хочу добавить индикатор выполнения в быстрый iOS 8 UIAlertController. Это возможно? Есть ли способ подкласса UIAlertController и добавить панель progres и подключить некоторые функции делегата?
спасибо
Если вам просто нужен индикатор прогресса, вы можете просто добавить его в качестве подпредставления следующим образом:
Обновлено для Swift 5:
// 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
present(alertView, animated: true, completion: {
// Add your progressbar after alert is shown (and measured)
let margin:CGFloat = 8.0
let rect = CGRect(x: margin, y: 72.0, width: alertView.view.frame.width - margin * 2.0 , height: 2.0)
self.progressView = UIProgressView(frame: rect)
self.progressView!.progress = 0.5
self.progressView!.tintColor = self.view.tintColor
alertView.view.addSubview(self.progressView!)
})
Swift 2.0:
// 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)
})
Очень сложно изменить размер UIAlertController
для большего контента, но для индикатора выполнения это должно UIAlertController
.
Мои извинения, ребята, за использование объектива c, в этом решении, но я подумал, что это может помочь другим, которые еще не используют Swift. И, также, вы можете, вероятно, легко преобразовать это в Swift. Это больше методология, которую я хотел бы выделить.
Я также не уверен, может ли Apple отклонить это решение, но здесь все равно.
Apple заявляет, что с iOS7 и далее UIAlertView не следует подклассифицировать. Иерархия представления для этого класса является частной и ее нельзя изменять:
https://developer.apple.com/reference/uikit/uialertview?language=objc
Другими словами, добавление UIView в UIAlertView абсолютно не влияет.
Однако у меня есть решение, которое включает добавление UIProgressView над UIAlertView, но добавление первого в окно приложения. Используя свойство UIView superiew.center и некоторые небольшие корректировки, можно добиться желаемого эффекта:
-(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];
}
Я добавляю затухание, чтобы позволить UIAlertView полностью отображаться первым. Затем добавьте некоторые другие функции делегата, чтобы убрать UIProgressView в правильные моменты:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if(self.alert.cancelButtonIndex == buttonIndex){
[self.progbar removeFromSuperview];
}
}
- (void)alertViewCancel:(UIAlertView *)alertView{
[self.progbar removeFromSuperview];
}
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)
}
Решение с автоматической разметкой:
UIAlertController *alertCtr = [UIAlertController alertControllerWithTitle:@"Test" message:@"50%" preferredStyle:UIAlertControllerStyleAlert];
[alertCtr addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
// Do things
}]];
UIView *alertView = alertCtr.view;
UIProgressView *progressView = [[UIProgressView alloc] initWithFrame:CGRectZero];
progressView.progress = 0.5;
progressView.translatesAutoresizingMaskIntoConstraints = false;
[alertView addSubview:progressView];
NSLayoutConstraint *bottomConstraint = [progressView.bottomAnchor constraintEqualToAnchor:alertView.bottomAnchor];
[bottomConstraint setActive:YES];
bottomConstraint.constant = -45; // How to constraint to Cancel button?
[[progressView.leftAnchor constraintEqualToAnchor:alertView.leftAnchor] setActive:YES];
[[progressView.rightAnchor constraintEqualToAnchor:alertView.rightAnchor] setActive:YES];
[self presentViewController:alertCtr animated:true completion:nil];