iOS7中的UIAlertView addSubview


67

UIAlertView在iOS7中,使用addSubview方法已不建议向中添加一些控件。据我所知,苹果承诺增加contentView财产。

iOS 7现在已发布,我发现未添加此属性。这就是为什么我搜索一些自定义解决方案的功能,该解决方案可以向此AlertView添加进度栏。例如类似于TSAlertView的东西,但更适合在iOS 7中使用


3
GM种子被发布,而不是公开发布。如果需要,请与Apple测试并提出错误报告。
2013年

9
@Jeremy正如在SO上已多次指出的那样,iOS 7的问题并非离题。当然,任何开发人员都不应讨论他们同意的NDA涵盖的内容。但是,SO完全不在乎。
rmaddy13年

1
相当长一段时间以来,明确禁止更改UIAlertView的视图层次结构。“ UIAlertView类旨在按原样使用,不支持子类。此类的视图层次结构是私有的,不能修改。”
vikingosegundo


1
从iOS8上使用UIAlertController代替
亚诺什

Answers:


55

这是Github上的一个项目,用于将任何UIView添加到iOS7上看起来像UIAlertView的对话框中。

(从此StackOverflow线程复制。)

自定义iOS7 AlertView对话框


+1为“伟大的工作伙计”,我将更新我的答案以添加您的出色控制。
塔雷克·哈拉克

这里有另一个设计的另一个分支:github.com/kwent/ios-custom-alertview
昆汀·卢梭

这在禁用ARC的情况下不起作用。我花了整个下午的大部分时间试图修复原始的github项目,但没有成功。
Wedge Martin

3
感谢@WedgeMartin; 是的,该项目是ARC项目。但是,你并不需要修复原来的,只是在Xcode中设置一个例外:stackoverflow.com/questions/10523816/...
Wimagguc

@Wimagguc我已经实现了这个库。一个人认为我可以解决。如何从此自定义alertview访问uiview,uibutton之类的view属性?
Shourob Datta

35

我只用了1天的时间就创建了自己的警报视图,该视图与Apple的完全一样

  1. 拍摄Apple警报的屏幕快照以供参考(字体大小,间距,宽度)
  2. 创建一个带有标题,消息,自定义视图和按钮表的xib(Apple使用表代替UIButton现在的表,默认表单元就足够了)。请注意,您需要3个按钮表:两个用于左右按钮(每当按钮数为2时),另一个用于其他情况(一个按钮或两个以上按钮)。
  3. UIAlertView您的自定义警报中实施所有方法。

  4. 显示/关闭-您可以为警报创建特定的模式窗口,但我只是将警报放在根视图控制器的顶部。将可见警报注册到静态数组。如果显示第一个警报/关闭最后一个警报,请将窗口/视图控制器的色调模式更改为暗淡/自动,并添加/删除暗淡视图(alpha = 0.2的黑色)。

  5. 背景模糊-使用Apple的示例代码(我使用了不透明的白色)
  6. 3D动态效果-使用Apple的示例代码(5行代码)。如果您想要一个不错的效果,请在步骤5中拍摄一个略大的快照,并为警报背景和前景添加反动画。

编辑:

可以在“ 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];

背景模糊是唯一复杂的事情。如果可以改用不透明的颜色,请使用它。否则,需要进行大量实验。另请注意,背景较暗时,模糊的背景不是一个好的解决方案。

对于显示/关闭动画g,我正在使用新的spring动画方法:

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
                     }];

@Sulthan您能告诉我哪个WWDC视频或样本正在使用3d /视差效果吗?谢谢。安德烈
安德烈

好吧,我发现这非常有帮助。他们为您提供了执行此类动作所需的一切,并提供了额外的功能,我说这做得很好!
user2277872 2013年

14
乔治·阿斯达(George Asda):Sulthan提供了有关创建UIAlertView克隆时要涵盖的内容的高级清单。另外,通过不直接共享别人支付的代码来表现出员工的正直。他根本不需要帮助。表示尊重。更好的是,创建一个实现并与我们共享...对其他人做……
克里斯·哈顿

32

我编写了UIAlertView的完整实现,该实现模仿了完整的UIAlertView API,但是添加了我们一直想要的contentView属性:SDCAlertView

图片


2
@GeorgeAsda:关于您的错误:请提出一个单独的问题,并添加适当的信息和代码。自述文件指示项目需要正确构建哪些文件。不确定您对Cocoapods有什么看法,但是许多人认为这是获取此项目最新文件的最简单方法。
Scott Berrevoets

1
如果它不支持cocoapods,我认为这对图书馆是一个很大的负面影响,并且与其他添加第三方图书馆的手动方法相比,它更喜欢它。但是对于任何不喜欢它的人,如果他们选择,他们总是可以走艰难的道路。
加文2014年

5
豆荚绝对是必经之路。忽略反对者。如果他们不想使用Pod,那么手动添加就足够简单了,令我感到震惊的是反Pod人群多么粗鲁。
powerj1984'2014-4-23

1
@GeorgeAsda“如果这些依赖关系之一被更新并破坏了您的项目怎么办???” 使用cocoapods,您可以定义依赖项的版本并在那里“冻结”。另一方面,手动复制文件以准确告诉您所需的版本并不总是那么容易。
克雷姆克2014年

1
@Kremk我只想说我要负责我下载的内容,而不是一些血腥的豆荚...。您不必同意我的看法。您只需要接受不同的观点。
乔治·阿斯达

27

对于那些喜欢简单有效的方法而无需编写代码的人。这是一个很酷的解决方案,无需使用任何其他私有框架即可为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];
}

希望它可以帮助一些人,谢谢:)


3
我要求不赞成投票的人仔细检查答案,并在不赞成之前三思。至少在评论中提供原因是分钟。标准:v
Eshwar Chaitanya 2014年

不工作 在没有iOS 7的else情况下可以正常使用,这意味着条件可以正常使用,addSubviewif条件不能使用setValue
MaxEcho

@Salim请检查您的Xcode版本,ios 7在Xcode 5和更高版本上可用
Eshwar Chaitanya 2014年

1
很棒的答案。对我而言,将UIActivityIndi​​catorView添加到UIAlertView就像是一种魅力。我刚刚使用活动指示器更改了UIImageView
Septronic,2014年

图像尺寸将被忽略。不明白为什么。
bruno 2015年

17

对于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];

这适用于iOS 5及更高版本。这不仅仅是iOS 7的事情。
Brian Stormont

10

UIAlertViewiOS7中不会有自定义视图,也不会有contentViewApple改变主意,因此addSubview现在不可能UIAlertView

根据苹果论坛上的许多话题SVProgressHUD是一个很好的选择。

编辑

有没有正式addSubview,也继承了UIAlertViewiOS7

UIAlertView类旨在按原样使用,并且不支持子类化。此类的视图层次结构是私有的,不能修改。

其他好的替代品:

wimagguc的ios-custom-alertview

MZFormSheetController


2
我仍然认为会按承诺添加contentView,因为这是在现有应用程序中破坏UI的愚蠢决定。
BS13年

4
您最好尝试找出其他方式。不会有奇迹。;-)
Matthias Bauch 2013年

1

您可以找到无需额外课程的简单解决方案 在这里

它是基于设定accessoryView的普通UIAlertView中


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.