Прокрутка UIAlertController/UIAlertView на iOS 8
Мне интересно, знает ли кто-нибудь хорошее решение для того факта, что UIAlertViews и UIAlertControllers не будут прокручиваться на iOS 8? Вот пример:
[[[UIAlertView alloc] initWithTitle:@"Test" message:@"long string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong
string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\n
long string\nlong string\nlong string\nlong string\nlong string\nlong string\n
long string\nlong string\nlong string\nlong string\nlong string\nlong string\n"
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil] show];
Запуск этого кода на iOS 7 и 8 дает следующие результаты. (Изменение его на UIAlertController не имеет значения).
iOS 8:
IOS 7:
Как вы можете видеть, он четко прокручивается на iOS 7, но не на iOS 8. Есть ли какое-то свойство, которое мне здесь не хватает, или это просто бета-ошибка?
5 ответов
Хотя я не знаю, как правильно, я мог бы решить проблему в любом случае. Похоже на прокрутки вида, если вы установили свойство frame (но не CGRectZero). На iOS 8.0.2 все работало нормально.
NSString* messageString = @"long string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\n";
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title"
message:messageString
preferredStyle:UIAlertControllerStyleAlert];
alertController.view.frame = [[UIScreen mainScreen] applicationFrame];
[alertController addAction:[UIAlertAction actionWithTitle:@“OK”
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action){
[self okButtonTapped];
}]];
[self presentViewController:alertController animated:YES completion:nil];
//——
- (void) okButtonTapped{};
Решение cafedeichi не сработало для меня, поэтому я в итоге использовал DTAlertView, который работает как на iOS 8, так и на iOS 7.
Проблема была исправлена в iOS 8.3. Я использую решение cafedeichi, но если не работает в ландшафтном режиме для iPhone и iPod touch, и если вы добавите текстовое поле, то это будет зависать в iOS 8.3, поэтому я использую этот код прямо сейчас исправляет две упомянутые проблемы:
NSString* messageString = @"long string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\nlong string\n";
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title"
message:messageString
preferredStyle:UIAlertControllerStyleAlert];
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.3) {
CGFloat screenHeight;
CGFloat screenWidth;
if ([[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortraitUpsideDown){
screenHeight = [UIScreen mainScreen].applicationFrame.size.height;
screenWidth = [UIScreen mainScreen].applicationFrame.size.width;
} else{
screenHeight = [UIScreen mainScreen].applicationFrame.size.width;
screenWidth = [UIScreen mainScreen].applicationFrame.size.height;
}
CGRect alertFrame = CGRectMake([UIScreen mainScreen].applicationFrame.origin.x, [UIScreen mainScreen].applicationFrame.origin.y, screenWidth, screenHeight);
alertController.view.frame = alertFrame;
}
[alertController addAction:[UIAlertAction actionWithTitle:@“OK”
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action){
[self okButtonTapped];
}]];
[self presentViewController:alertController animated:YES completion:nil];
//——
- (void) okButtonTapped{};
Использовать этот:
NSString *message = @"YOUR LONG MESSAGE" ;
NSInteger lines = [[message componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] count];
UITextView *txtView = nil ;
if (lines > MAX_LINES_TO_SHOW)
{
txtView = [[UITextView alloc] init];
[txtView setBackgroundColor:[UIColor clearColor]];
[txtView setTextAlignment:NSTextAlignmentCenter] ;
[txtView setEditable:NO];
[txtView setText:message];
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] ;
[alert setValue:txtView forKey:@"accessoryView"];
[alert setTag:tag] ;
[alert show] ;
Любые экземпляры UIAlertView должны быть сначала изменены на экземпляры UIAlertController. (Их можно использовать почти таким же образом.) После изменения его на UIAlertController установите для свойства frame основной экран приложения. (настройка view.frame для UIAlertView не помогает) Очевидно, что они не поддерживают UIAlertViews в IOS8, хотя это не так ясно, как должно быть.