2013-05-11 2 views
4

Есть ли способ установить цвет индикатора активности (возможно, UIActivityIndicatorView) UIRefreshControl?Установить цвет UIActivityIndicatorView UIRefreshControl?

Я был в состоянии установить цвет «резины» и индикатор:

[_refreshControl setTintColor:[UIColor colorWithRed:0.0f/255.0f green:55.0f/255.0f blue:152.0f/255.0f alpha:1.0]]; 

Но я хочу, чтобы иметь синий и индикатор активности в «резиновом» белом цвете, возможно ли это?

ответ

3

Это официально не поддерживается, но если вы хотите, чтобы рисковать будущие изменения IOS нарушая ваш код, который вы можете попробовать это:

Строительство от ответа ayoy, я построил подкласс UIRefreshControl, который устанавливает цвет ActivityIndicator в beginRefresing. Это должно быть лучшим местом для этого, поскольку вы можете называть это кодом вместо пользователя, вызывающего анимацию.

@implementation WhiteRefreshControl : UIRefreshControl 

- (void)beginRefreshing 
{ 
    [super beginRefreshing]; 

    NSArray *subviews = [[[self subviews] lastObject] subviews]; 
    //Range check on subviews 
    if (subviews.count > 1) 
    { 
     id spinner = [subviews objectAtIndex:1]; 
     //Class check on activity indicator 
     if ([spinner isKindOfClass:[UIActivityIndicatorView class]]) 
     { 
      UIActivityIndicatorView *spinnerActivity = (UIActivityIndicatorView*)spinner; 
      spinnerActivity.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite; 
     } 
    } 
} 
+0

Спасибо, это именно то, что мне нужно. Очень хорошо и многократно :) Также благодаря айой для первоначальной идеи :) –

+0

Разве вы не должны называть '[super beginRefreshing];' в конце или в какой-то момент? – Hlung

+0

Yup пропустил это. Я обновил свой ответ. – Mike

1

Нет, это невозможно. Вам нужно будет указать an enhancement request, чтобы попросить Apple реализовать это.

+0

Спасибо Дэйв, я открыл запрос на расширение с Apple! ID: 13870593 –

2

Ну, вы технически можете это сделать, но это не поддерживается. Вы лучше следуете за предложением Дейва или читаете, если вы настаиваете.

Если вы исследуете subviews из UIRefreshControl, выясняется, что он содержит одно подзону, класса _UIRefreshControlDefaultContentView.

Если вы затем проверить подвидов этой точки зрения содержания в освежающей состоянии, он содержит следующее:

  • UILabel
  • UIActivityIndicatorView
  • UIImageView
  • UIImageView

Так технически в вашем обратный вызов UIControlEventValueChanged случае вы можете сделать что-то вроде этого:

UIActivityIndicatorView *spinner = [[[[self.refreshControl subviews] lastObject] subviews] objectAtIndex:1]; 
spinner.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite; 

И это будет работать. Он также не нарушает Руководство по проверке приложений, так как он не использует частный API (просмотр подзаголовков представления и игра с ними с использованием общедоступного API является законным). Но имейте в виду, что внутренняя реализация UIRefreshControl может измениться в любое время, и ваш код может не работать или даже сбой в более поздних версиях iOS.

+0

Хм, интересно, я скопировал код, он не работает ... Похоже, что внутри нет идентификатора UIActivityIndicator, но: для (id v in [[[_refreshControl subviews] lastObject] subviews]) { NSLog (@ "% @", [v класс]); } Предоставляет мне: UILabel, UIImageView, UIImageView –

+0

Как я уже сказал в ответе, вы должны вызвать это в обратном вызове UIControlEventValueChanged. Затем он получает UIActivityIndicatorView. – ayoy

+1

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

Смежные вопросы