Проблема доступа к границам на нескольких UIAlertViews - PullRequest
3 голосов
/ 25 сентября 2010

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

Вот код, иллюстрирующий проблему. Это добавлено в совершенно новое приложение View:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self makeAlert:@"Zero alert" withMessage:@"This is the zero alert"];

    UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:@"First Alert" message:@"Here is the first alert" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [firstAlert show];
    NSLog(@"first alert bounds, origin: %f, %f  size: %f, %f",firstAlert.bounds.origin.x,firstAlert.bounds.origin.y,firstAlert.bounds.size.width,firstAlert.bounds.size.height);
    [firstAlert release];

    UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:@"Second Alert" message:@"Here is the second alert" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [secondAlert show];
    NSLog(@"second alert bounds, origin: %f, %f  size: %f, %f",firstAlert.bounds.origin.x,firstAlert.bounds.origin.y,firstAlert.bounds.size.width,firstAlert.bounds.size.height);
    [secondAlert release];

    [self makeAlert:@"Third Alert" withMessage:@"Here is the third alert."];
    [self makeAlert:@"Fourth Alert" withMessage:@"Here is the fourth alert."];
}

- (void)makeAlert:(NSString *)makeTitle withMessage:(NSString *)makeMessage {
    UIAlertView *newAlert = [[UIAlertView alloc] initWithTitle:makeTitle message:makeMessage delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [newAlert show];
    NSLog(@"%@ alert bounds, origin: %f, %f  size: %f, %f",makeTitle,newAlert.bounds.origin.x,newAlert.bounds.origin.y,newAlert.bounds.size.width,newAlert.bounds.size.height);
    [newAlert release];
}  

Добавьте описание makeAlert в файл .h и запустите это приложение, и вы увидите проблему в журнале. Нулевое предупреждение будет показывать начало координат 0,0 и соответствующую ширину и высоту (284, 141 на 3 / GS). Все остальные оповещения будут отображать 0,0 для ширины, высоты.

Если вы закомментируете нулевую строку оповещения (сначала [self makeAlert...]), то firstAlert и secondAlert покажут правильную ширину и высоту, а третье и четвертое оповещения покажут 0,0.

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

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

Есть мысли о том, почему я получаю 0,0 для ширины, высоты для этих вызовов?

1 Ответ

1 голос
/ 03 августа 2011

Я не уверен, почему вы получаете любые правильные границы для предупреждений - рамки UIAlertView вычисляются непосредственно перед отображением .

У меня была эта проблема до . В моем случае я смотрел на размеры кнопок UIAlertView, которые всегда показывали ширину и высоту 0.

Мне удалось получить правильную информацию о кадре с помощью UIAlertViewDelegate и реализации

- (void)willPresentAlertView:(UIAlertView *)alertView

Если вы не можете реорганизовать свой код для работы с использованием делегата, моим следующим лучшим предложением будет откат вашего собственного класса UIAlertView. На github есть несколько хороших, таких как TSAlertView

...