我正在尝试使用样式 UIAlertControllerStyleActionSheet (以前称为UIActionSheet)创建自定义 UIAlertController ,我遇到了很多麻烦,只需自定义它。我希望我的UIAlertAction 包含左侧图像和减少按钮大小。
我知道这是可行的:
(这正是我正在寻找的)
我搜索了几个小时,但我在互联网上找不到任何可以帮助我完成这个简单任务的tut。另外,由于UIActionSheet自IOS 9以来已被弃用,因此无论何时我尝试找到解决方案,它都不再可用。另外,我读到UIAlertController不打算被子类化......
有谁知道如何实现我的警报轻量级自定义? 我是否必须将UIView子类化为自己的警报表?
答案 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];
答案 1 :(得分:1)
对于那些对我如何克服这个问题感兴趣的人,我发布了我的解决方案:
我终于放弃了 UIAlertController ,它不打算被子类化。相反,在我的ViewController中,我创建了一个以编程方式重新创建相同效果和渲染的方法:
创建一个 UIView ,占据整个屏幕的设置,其alpha值为~0.7。 (这有两个目标,一个是美学目标,一个是物理目标,隐藏当前视图,避免单击自定义警报后面的按钮)
创建 UIButtons 并将其手动放在当前视图中。
将此foregroundView和按钮添加到当前视图,单击按钮时将其删除。
示例代码:
-(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)];
}];
}
此代码比添加视图和按钮要复杂一些,以便在警报显示时重新创建动画: