UIAlertController和UIAlertControllerStyleActionSheet自定义

时间:2016-11-18 11:20:03

标签: ios objective-c

我正在尝试使用样式 UIAlertControllerStyleActionSheet (以前称为UIActionSheet)创建自定义 UIAlertController ,我遇到了很多麻烦,只需自定义它。我希望我的UIAlertAction 包含左侧图像减少按钮大小

我知道这是可行的:

enter image description here

(这正是我正在寻找的)

我搜索了几个小时,但我在互联网上找不到任何可以帮助我完成这个简单任务的tut。另外,由于UIActionSheet自IOS 9以来已被弃用,因此无论何时我尝试找到解决方案,它都不再可用。另外,我读到UIAlertController不打算被子类化......

有谁知道如何实现我的警报轻量级自定义? 我是否必须将UIView子类化为自己的警报表?

2 个答案:

答案 0 :(得分:5)

此解决方案确实使用私有API /属性。根据我的研究和经验,这是我知道你可以自定义UIAlertController的唯一方法。如果你看一下公共标题,UIAlertContoller几乎没有定制空间。但是,在iOS 8中启动UIAlertController之后,这个解决方案通常在开发人员中使用。您可以完全依赖Github的依赖关系。我希望我的回答可以解决你的问题。 我相信这就是你要找的东西,结果就像这样:

首先,您必须创建UIAlertController

UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"Alert Title" message:@"" preferredStyle:UIAlertControllerStyleActionSheet];

自定义字体!即使只是某些角色。

NSMutableAttributedString *hogan = [[NSMutableAttributedString alloc] initWithString:@"Presenting the great... StackOverFlow!"];
[hogan addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:30.0] range:NSMakeRange(24, 11)];
[alertVC setValue:hogan forKey:@"attributedTitle"];

现在,让我们创建一个UIAlertAction,您可以在其中添加动作处理程序并添加图标。

UIAlertAction *button = [UIAlertAction actionWithTitle:@"First Button"
                                                 style:UIAlertActionStyleDefault
                                               handler:^(UIAlertAction *action){
                                                   //add code to make something happen once tapped
                                               }];
UIAlertAction *button2 = [UIAlertAction actionWithTitle:@"Second Button"
                                                 style:UIAlertActionStyleDefault
                                               handler:^(UIAlertAction *action){
                                                   //add code to make something happen once tapped
                                               }];

在此处,您将图标添加到AlertAction。对我来说,你必须指定UIImageRenderingModeAlwaysOriginal

[button setValue:[[UIImage imageNamed:@"image.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];

[alertVC addAction:button2];
[alertVC addAction:button];

请记住提供ViewController

[self presentViewController:alertVC animated:YES completion:nil];

enter image description here

答案 1 :(得分:1)

对于那些对我如何克服这个问题感兴趣的人,我发布了我的解决方案:

我终于放弃了 UIAlertController ,它不打算被子类化。相反,在我的ViewController中,我创建了一个以编程方式重新创建相同效果和渲染的方法:

  1. 创建一个 UIView ,占据整个屏幕的设置,其alpha值为~0.7。 (这有两个目标,一个是美学目标,一个是物理目标,隐藏当前视图,避免单击自定义警报后面的按钮)

  2. 创建 UIButtons 并将其手动放在当前视图中。

  3. 将此foregroundView和按钮添加到当前视图,单击按钮时将其删除。

  4. 示例代码:

    -(void) displayAlertChoice{
    
        // create foreground layer to hide current view
        foregroundLayer = [[UIView alloc] initWithFrame:CGRectMake(0,0,screenWidth,screenHeight)];
        foregroundLayer.backgroundColor = [UIColor blackColor];
        foregroundLayer.alpha = 0.0;
        [self.view addSubview:foregroundLayer];
        [UIView animateWithDuration:0.2 animations:^{foregroundLayer.alpha = 0.7;}]; // animation de son apparition (alpha)
    
        // Hide foreground layer when clicked
        UITapGestureRecognizer *tapForegroundLayer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickForegroundLayer:)];
        [foregroundLayer addGestureRecognizer:tapForegroundLayer];
    
    
        // CancelButton
        cancelButton= [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [cancelButton setFrame:CGRectMake(marginWidth,
                                          2*screenHeight - buttonHeight - marginHeight, // OFF SCREEN
                                          buttonWidth,
                                          buttonHeight)];
        [cancelButton setTitle:@"Annuler" forState:UIControlStateNormal];
        [cancelButton addTarget:self action:@selector(alertCancelButton:) forControlEvents:UIControlEventTouchUpInside];
        [cancelButton setBackgroundColor:[UIColor whiteColor]];
        cancelButton.layer.cornerRadius = 8;
        [self.view addSubview:cancelButton];
        [UIView animateWithDuration:0.2 animations:^{ // animation de son apparition (fram up)
            [cancelButton setFrame:CGRectMake(marginWidth,
                                              screenHeight - buttonHeight - marginHeight, // ON SCREEN
                                              buttonWidth,
                                              buttonHeight)];
        }];
    }
    

    此代码比添加视图和按钮要复杂一些,以便在警报显示时重新创建动画:

    • 使用 [UIView animateWithDuration:animations:^ {}]; 我能够逐渐隐藏前景视图并使取消按钮显示在屏幕底部。
    • 注意:你不能直接将UIButtons添加到foregroundView(这里称为foregroundLayer),否则它们将是我们之前设置的0.7 alpha的
    • 我在foregroundView中添加了一个手势识别器选择器,它具有与cancelButton选择器相同的效果:它从superview中删除所有创建的对象。这样,当用户在列表边缘外单击时,它会关闭自定义AlertView。