在iOS 7中,使用addSubview
方法向UIAlertView
添加控件已经不再被推荐。据我所知,苹果公司承诺会添加contentView
属性。
iOS 7现已发布,但我发现该属性尚未添加。因此,我正在寻找一些自定义解决方案,以便向该alertView添加进度条等功能。例如类似于TSAlertView的东西,但更适合在中使用。
在iOS 7中,使用addSubview
方法向UIAlertView
添加控件已经不再被推荐。据我所知,苹果公司承诺会添加contentView
属性。
iOS 7现已发布,但我发现该属性尚未添加。因此,我正在寻找一些自定义解决方案,以便向该alertView添加进度条等功能。例如类似于TSAlertView的东西,但更适合在中使用。
(来源:这个StackOverflow帖子。)
我只用了1天就创建了一个与苹果的警告视图完全相同的自定义警告视图
UIButton
,默认表格单元足够好)。请注意,您需要3个按钮表格:两个用于左侧和右侧按钮(当按钮数量为2时),另一个用于其他情况(一个按钮或多个按钮)。实现UIAlertView
的所有方法到您的自定义警告视图中。
显示/隐藏 - 您可以为警报创建特定的模态窗口,但我只是将我的警报放在顶部的根视图控制器上。将您可见的警报注册到静态数组中。如果显示第一个警报/解除最后一个警报,请将您的窗口/视图控制器的色调模式更改为暗淡/自动,并添加/删除一些暗淡的视图(黑色,alpha = 0.2)。
编辑:
模糊背景和视差效果示例代码均可在“iOS_RunningWithASnap”WWDC 2013示例代码中找到
视差效果:
UIInterpolatingMotionEffect* xAxis = [[[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x"
type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis] autorelease];
xAxis.minimumRelativeValue = [NSNumber numberWithFloat:-10.0];
xAxis.maximumRelativeValue = [NSNumber numberWithFloat:10.0];
UIInterpolatingMotionEffect* yAxis = [[[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y"
type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis] autorelease];
yAxis.minimumRelativeValue = [NSNumber numberWithFloat:-10.0];
yAxis.maximumRelativeValue = [NSNumber numberWithFloat:10.0];
UIMotionEffectGroup *group = [[[UIMotionEffectGroup alloc] init] autorelease];
group.motionEffects = @[xAxis, yAxis];
[self addMotionEffect:group];
模糊的背景是唯一复杂的地方。如果可以使用不透明的颜色代替,尽量使用。否则需要进行大量的实验。另外请注意,当背景为暗色时,模糊的背景并不是一个好的解决方案。
对于显示/隐藏动画,我正在使用新的弹簧动画方法:
void (^animations)() = ^{
self.alpha = 1.0f;
self.transform = CGAffineTransformIdentity;
};
self.alpha = 0.0f;
self.transform = CGAffineTransformMakeScale(0.5f, 0.5f);
[UIView animateWithDuration:0.3
delay:0.0
usingSpringWithDamping:0.7f
initialSpringVelocity:0.0f
options:UIViewAnimationOptionCurveLinear
animations:animations
completion:^(BOOL completed) {
//calling UIAlertViewDelegate method
}];
对于那些喜欢简单有效方法而不需要编写代码的人,这里提供了一个酷炫的解决方案,无需使用任何其他私有框架即可向iOS 7警报视图添加子视图,即
[alertView setValue:imageView forKey:@"accessoryView"];
为了更好地理解,以下是示例代码:
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(180, 10, 85, 50)];
UIImage *wonImage = [UIImage imageNamed:@"image.png"];
[imageView setImage:wonImage];
//check if os version is 7 or above
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
[alertView setValue:imageView forKey:@"accessoryView"];
}else{
[alertView addSubview:imageView];
}
希望这能帮助到某些人,谢谢 :)
else
条件与addSubview
正常工作,但if
条件与setValue
不起作用。 - MD SHAHIDUL ISLAM适用于IOS7
UIAlertView *alertView1 = [[UIAlertView alloc] initWithTitle:@"Enter Form Name"
message:@""
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Ok", nil];
alertView1.alertViewStyle = UIAlertViewStyleSecureTextInput;
UITextField *myTextField = [alertView1 textFieldAtIndex:0];
[alertView1 setTag:555];
myTextField.keyboardType=UIKeyboardTypeAlphabet;
[alertView1 show];
在iOS7中,将不再有带有自定义视图的UIAlertView
,也不会有苹果公司改变心意的contentView
,因此现在在UIAlertView
中是不可能使用addSubview
的。
根据苹果论坛上许多帖子,SVProgressHUD是一个很好的替代品。
编辑:
iOS7中正式没有addSubview
或UIAlertView
的子类化。
UIAlertView
类旨在按原样使用,不支持子类化。该类的视图层次结构是私有的,不得修改。
其他很好的替代品:
PKAlertController (https://github.com/goodpatch/PKAlertController) 是一个非常棒的库。我测试了很多类似的库,只有它满足了我所有的需求。
它的优点: