В представлении "Предупреждение" отображается белый прямоугольник в iOS7

Следующий код отлично работает с iOS 5 до 6.1. У меня даже есть приложения в магазине с этим кодом:

-(void)showActivityIndicator
{
    if(!mLoadingView) //
    {
        mLoadingView = [[UIAlertView alloc] initWithTitle:@"" message:@"" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
        mLoadingView.tag = kAlertViewTag;
    }

    [mLoadingView show];
}

- (void)willPresentAlertView:(UIAlertView *)alertView
{
    if (alertView.tag == kAlertViewTag)
    {
        UIActivityIndicatorView *actInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
        actInd.frame = CGRectMake(128.0f, 45.0f, 25.0f, 25.0f);
        [alertView addSubview:actInd];
        [actInd startAnimating];

        UILabel *l = [[UILabel alloc]init];
        l.text = NSLocalizedString(@"PRODUCT_PURCHASE_INDICATOR_TITLE", @"Please wait...");
        l.font = [UIFont fontWithName:@"Helvetica" size:16];

        float strWidth = [l.text sizeWithFont:l.font].width;
        float frameWidth = alertView.frame.size.width;
        l.frame = CGRectMake((frameWidth - strWidth)/2, -25, 210, 100);

        l.textColor = [UIColor whiteColor];
        l.shadowColor = [UIColor blackColor];
        l.shadowOffset = CGSizeMake(1.0, 1.0);
        l.backgroundColor = [UIColor clearColor];
        [alertView addSubview:l];
    }
}

Он отобразит предупреждение без кнопок и индикатора активности и метки. Однако в iOS7 я вижу только белый округлый прямоугольник, без индикатора активности.

Что я могу сделать, чтобы выполнить эту работу с iOS 5 до 7?

Update:

Чтобы быть более наглядным, я добавляю скриншоты. Ниже приведен снимок экрана с iOS 5 до 6.1. Там прекрасно работает.

enter image description here

Ниже приведен iOS7. Как вы видите, даже размер меньше. Похоже, он не полностью инициализирован или что-то в этом роде.

enter image description here

Ответ 1


теперь addSubview недоступен в UIAlertView в iOS7

Класс UIAlertView предназначен для использования как есть и не поддерживает подклассы. Иерархия представления для этого класса является частной и не должна быть изменена.

В качестве альтернативы вы можете использовать SVProgressHUD.

Ответ 2

Начиная с iOS 7, вы можете:

    [alertView setValue:customContentView forKey:@"accessoryView"];

чтобы получить пользовательский контент в стандартном представлении предупреждения.

Ответ 3

Мне пришлось быстро решить эту проблему, поэтому я построил UIView UIAiew с iIA7 UIAlertView с его анимациями, которые могут быть расширены любым пользовательским контентом.

Могут быть и другие, которые могут использовать мое решение, поэтому я сделал весь код, доступный в Github.

enter image description here

Кроме того, если вы хотите продолжать использовать UIAlertView в предыдущих версиях ОС, вам нужно разблокировать код. Это может быть так плохо, как кажется, я использую следующее:

float sysVer = [[[UIDevice currentDevice] systemVersion] floatValue];

if (sysVer < 7) {
  // your old solution
} else {
  .. // iOS7 dialog code
}

(Имейте в виду, что это ни в коем случае не является реальным решением - если Apple не хочет, чтобы мы использовали диалоги для всех видов вещей, тогда мы, вероятно, не должны этого делать.)