2013-11-16 5 views
4

Это похоже на этот вопрос (Showing a UIProgressView inside or on top of a UINavigationController's UINavigationBar), но я не могу получить ответ там, чтобы работать для меня без Xcode, бросающего какую-то отвратительную ошибку.Добавить UIProgressView под навигационным контроллером

У меня есть аналогичная проблема, но я хочу добавить индикатор выполнения на главном представлении контроллера разделенного вида, так что это табличное представление, но код, приведенный в приведенном выше ответе, не работает (я не знаю, т имеют доступ к панели навигации точно так же,

Я попытался переработать ее как таковую:.

UIProgressView *progress = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];; 
[progress setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[self.navigationController.navigationBar addSubview:progress]; 

Который очень почти работает, но это добавляет его выше точки зрения, а не ниже и половинной ширина (досадно). Я могу сделать это в раскадровке, но когда я динамически выталкиваю новое табличное представление в стек навигации, он снова исчезает.

Я прицеливания для этого:

Progressview Under Nav

Спасибо за любую помощь!

+0

Почему вы не пытались создать пользовательский навигационный контроллер как сказал ni, который отвечает? –

+0

Это всегда опция: https://github.com/sgryschuk/SGNavigationProgress –

+0

@ 0x7fffffff Зачем использовать внешнюю библиотеку (ту, для которой нет очевидной причины огромной базы кода), для такой простой задачи? – Lefteris

ответ

0

Эта техника отлично работает для меня. В дополнение к добавлению его в панель навигации добавьте ограничение, которое удерживает его .5 или 1 пиксель над дном и прикрепите его к левой и правой сторонам. Затем он работает и в ландшафте.

В моем случае я использовал подкласс навигационного контроллера, добавлял ли он и скрывал контроль выполнения, а затем предоставлял удобный метод, позволяющий любому контроллеру вида получить к нему доступ.

EDIT: код, но не был составлен или используется мною с 2013 г. Ее в подклассе Navigation Controller:

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 

UIProgressView *progress = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar]; 
progress.tag = DISPLAY_PROGRESS_VIEW; 
[self.view addSubview:progress]; 
UINavigationBar *navBar = [self navigationBar]; 

NSLayoutConstraint *constraint; 
constraint = [NSLayoutConstraint constraintWithItem:progress attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:navBar attribute:NSLayoutAttributeBottom multiplier:1 constant:-0.5]; 
[self.view addConstraint:constraint]; 

constraint = [NSLayoutConstraint constraintWithItem:progress attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:navBar attribute:NSLayoutAttributeLeft multiplier:1 constant:0]; 
[self.view addConstraint:constraint]; 

constraint = [NSLayoutConstraint constraintWithItem:progress attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:navBar attribute:NSLayoutAttributeRight multiplier:1 constant:0]; 
[self.view addConstraint:constraint]; 

[progress setTranslatesAutoresizingMaskIntoConstraints:NO]; 
progress.hidden = YES; 

UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)]; 
[navBar addGestureRecognizer:longPressGesture]; 
} 
+0

Вы имеете в виду, что использовали раскадровку для достижения этого или чего-то еще? – SteveDolphin23

+0

Я сделал это в viewDidLoad в подклассе контроллера nav, но он может работать в раскадровке. Кажется, у меня проблемы с настройкой ограничений в ib - я бы хотел, чтобы был способ уменьшить масштаб - но я думаю, это сработает. –

+0

David, я получаю сообщение об ошибке при попытке добавить ваши ограничения: «NSInternalInconsistencyException», причина: «Невозможно настроить макет с иерархией представления, не подготовленной для ограничения». Вы изменили ограничения в своем пользовательском контроллере nav, чтобы заставить технику плакатов работать? Я также должен отметить, что я создаю все свои взгляды программно в loadView. – windup

4
override func viewDidLoad() { 
    super.viewDidLoad() 

    // if VC is pushed in a navigation controller I add a progress bar 
    if let navigationVC = self.navigationController { 

     // create progress bar with .bar style and add it as subview 
     let progressBar = UIProgressView(progressViewStyle: .Bar) 
     navigationVC.navigationBar.addSubview(progressBar) 

     // create constraints 
     // NOTE: bottom constraint has 1 as constant value instead of 0; this way the progress bar will look like the one in Safari 
     let bottomConstraint = NSLayoutConstraint(item: navigationVC.navigationBar, attribute: .Bottom, relatedBy: .Equal, toItem: progressBar, attribute: .Bottom, multiplier: 1, constant: 1) 
     let leftConstraint = NSLayoutConstraint(item: navigationVC.navigationBar, attribute: .Leading, relatedBy: .Equal, toItem: progressBar, attribute: .Leading, multiplier: 1, constant: 0) 
     let rightConstraint = NSLayoutConstraint(item: navigationVC.navigationBar, attribute: .Trailing, relatedBy: .Equal, toItem: progressBar, attribute: .Trailing, multiplier: 1, constant: 0) 

     // add constraints 
     progressBar.translatesAutoresizingMaskIntoConstraints = false 
     navigationVC.view.addConstraints([bottomConstraint, leftConstraint, rightConstraint]) 
    } 
} 
+0

Как показать финиш или отменить для этого UIProgressbar? – developer

0
// Add progress view to bar 
myProgressView.frame = CGRect(x: 0, y: 64, width: self.view.frame.width, height: 4) 
myProgressView.alpha = 0 
myProgressView.backgroundColor = Color.dark() 
myProgressView.tintColor = UIColor.white 

navigationController!.view.addSubview(myProgressView) 
Смежные вопросы