UIAlertController/UIAlertView在iOS 8上的滚动问题

9

我想知道有没有好的解决方法来应对在iOS 8上UIAlertViews和UIAlertControllers无法滚动的问题?这里是一个例子:

[[[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 iOS 7: “iOS 对比两张图片可以看出,它在iOS 7上可以清晰地滚动,但在iOS 8上不能。我是否遗漏了某些属性或只是一个beta错误?

1
是的,我想这是一个“等待观察”的情况。如果他们在完全覆盖UI之前删除了屏幕上唯一有用的信息显示方式,那将是荒谬的。此外,关于HIG,正如您所看到的,如果文本太长,按钮会消失(也是HIG违规,但这不是我的重点),导致警报视图被卡住并强制重新启动应用程序。这不是一个好的用户体验 ;) - Rick
这个问题有任何更新吗? - AlexanderN
我上次测试时它还是有问题的,但那可能是在之前的测试版中,最近我实际上没有再试过。这不是我们应用程序中非常关键的功能,因此在其他项目优先考虑的情况下,它被推迟到了列表底部。 - Rick
这个仍在发生... 至少标题现在显示了,我想。 - Max Chuquimia
是的,它正在显示,并且按钮可以正常工作,所以你实际上可以将其关闭。至少这是好的。 - Rick
显示剩余8条评论
5个回答

11

虽然我不知道正确的方法,但我仍然可以解决这个问题。 如果设置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{};

抱歉,你是对的,将视图框架设置为屏幕大小可以正常工作。也许你应该更改你的代码,使用一个长消息作为示例。 - jcesarmobile
这可能会有用,下次我上班时会试一试。但是会强制复制一些代码,因为它不适用于iOS 7,但总比没有好。 - Rick
1
虽然我自己没有尝试过这段代码(因为我换了工作并忘记了它),但我相信你的话,认定这是正确的答案。 - Rick
1
这在竖屏模式下可以工作,但在横屏模式下无法工作。 - Mohamed Hafez
1
这个修复可以解决在iOS 8.3上添加文本字段时崩溃的问题,但在iOS 8.3上已经修复了这个问题,因此您应该添加这行代码以避免崩溃并解决早期版本的问题 if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.3) { alertController.view.frame = [[UIScreen mainScreen] applicationFrame]; } - jcesarmobile
显示剩余2条评论

3
问题已在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{};

1
这是一段好的代码!应该被接受作为答案。如果能提供到实际在8.3中修复了这个bug的参考,就更加出色了。 - ullstrm
我没有看到官方的错误修复参考,只是测试了一下,发现没有这段代码也能正常工作。 - jcesarmobile

3

cafedeichi的解决方案对我无效,所以我最终使用了DTAlertView,它可以在iOS 8和iOS 7上运行。


0
请使用这个:
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] ;

0

任何UIAlertView实例都必须首先更改为UIAlertController实例。(它们可以以几乎相同的方式使用。)将其更改为UIAlertController后,将frame属性设置为应用程序主屏幕。(设置UIAlertView的view.frame没有帮助)显然,在IOS8中他们正在废弃UIAlertViews,尽管这并不像应该的那样清晰。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接