Отображение UIActivityIndicatorView в центре экрана

#iphone #objective-c #xcode4

#iPhone #objective-c #xcode4

Вопрос:

Есть ли способ отобразить UIActivityIndicatorView в центре экрана, чтобы отразить NetworkActivityIndicator? Итак, я хочу тот же процесс, что и NetworkActivityIndicator, только с более крупным индикатором, который будет более заметен пользователю.

Ответ №1:

Попробуйте это:

 UIView *view = /* whatever your main view is */
UIActivityIndicatorView *spinner = [[UIActivityIndicatorVIew alloc] 
            initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
CGRect frame = spinner.frame;
frame.origin.x = view.frame.size.width / 2 - frame.size.width / 2;
frame.origin.y = view.frame.size.height / 2 - frame.size.height / 2;
spinner.frame = frame;
[view addSubview:spinner];
[spinner startAnimating];
[spinner release]; // Or, you could keep a handle to this for later to stop animating it
  

Это в основном центрирует счетчик в его окружающем представлении, каким бы оно ни было.

Если вы не сохраняете дескриптор для spinner, и если spinner является единственным подвидом view (или, по крайней мере, в хорошо известной позиции), вы могли бы позже получить дескриптор для него, перейдя для этого в [view subviews] .

РЕДАКТИРОВАТЬ: Вы также, вероятно, могли бы использовать CGRectGetMidX() и CGRectGetMidY() вместо более сложных уравнений, приведенных выше, для нахождения x и y … Ваш пробег может отличаться. 🙂

РЕДАКТИРОВАТЬ (25.02.2016)

Недавно этот ответ получил несколько голосов «за», поэтому я подумал, что обновление необходимо. На самом деле есть еще лучший способ сделать это сейчас. В этом примере a UIActivityIndicatorView помещается в центр a UITableView .

 self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
_spinner.translatesAutoresizingMaskIntoConstraints = NO;
_spinner.hidesWhenStopped = YES;
[self.tableView addSubview:self.spinner];

[self.tableView addConstraints:@[
                                 [NSLayoutConstraint constraintWithItem:_spinner
                                                              attribute:NSLayoutAttributeCenterX
                                                              relatedBy:NSLayoutRelationEqual
                                                                 toItem:self.tableView
                                                              attribute:NSLayoutAttributeCenterX
                                                             multiplier:1 constant:0],
                                 [NSLayoutConstraint constraintWithItem:_spinner
                                                              attribute:NSLayoutAttributeCenterY
                                                              relatedBy:NSLayoutRelationEqual
                                                                 toItem:self.tableView
                                                              attribute:NSLayoutAttributeCenterY
                                                             multiplier:1 constant:0]
                                 ]];
  

Комментарии:

1. Могу ли я узнать, как я могу добавить текст вместе с UIActivityIndicatorView

2. Вы могли бы создать UILabel , добавить его в свой вид, а затем использовать ограничения, скажем, центрировать его под индикатором. Вы могли бы использовать формат визуального ограничения, такой как "V:[spinner]-[label]" и NSLayoutFormatAlignAllCenterX .

Ответ №2:

У меня это работает внутри UIViewController:

 override func viewDidLayoutSubviews() {
    activityIndicator.center = view.center
}
  

Ответ №3:

 indicatorView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin;
indicatorView.center = self.view.center;
  

Ответ №4:

 activityInd.center = CGPointMake(160,240);
  

Комментарии:

1. Я думаю, вы имеете в виду, что это подходит только для iPhone. Лучше, если это можно записать как activityInd.center = CGPointMake(self.view.bounds.size.width / 2.0, self.view.bounds.size.height / 2.0); но я все равно поставлю 1, потому что центр imo лучше, чем установка рамки для этой конкретной цели.

2. Да, я говорил только об iPhone.

Ответ №5:

 -(void)setCenter:(UIView*)view{
UIActivityIndicatorView *actView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[view addSubview:actView];
[actView startAnimating];
CGSize boundsSize = view.bounds.size;
CGRect frameToCenter = actView.frame;
// center horizontally
if (frameToCenter.size.width < boundsSize.width)
    frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2;
else
    frameToCenter.origin.x = 0;

// center vertically
if (frameToCenter.size.height < boundsSize.height)
    frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2;
else
    frameToCenter.origin.y = 0;

actView.frame = frameToCenter;
  

}

Комментарии:

1. просто передайте view в эту функцию, она позаботится обо всем 🙂

Ответ №6:

В Swift:

 var activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)

override func viewDidLoad() {
    activityIndicator.hidesWhenStopped = true;
    activityIndicator.activityIndicatorViewStyle  = UIActivityIndicatorViewStyle.Gray;
    activityIndicator.center = view.center;
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}
  

Для получения дополнительной информации обратитесь к приведенному ниже руководству:

http://sourcefreeze.com/uiactivityindicatorview-example-using-swift-in-ios/

Ответ №7:

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

 - (void) viewDidLayoutSubviews
{
    if (self.spinner)
    {
        CGRect screenRect = self.view.bounds;

        self.spinner.frame = CGRectMake(roundf((screenRect.size.width - 50) * 0.5f),
                                        roundf((screenRect.size.height - 50) * 0.5f),
                                        50,
                                        50);
    }
}
  

Ответ №8:

Только эта работа идеально подходит для меня, проста и быстра:

 UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 

spinner.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2);

[self.view addSubview:spinner]; 
[spinner startAnimating];
  

Ответ №9:

в swift 2.0 xcode 7:

  override func viewDidLayoutSubviews() {
    self.Loader.center = self.view.center
 }