【问题标题】:UIAlertView addSubview in iOS7iOS7中的UIAlertView addSubview
【发布时间】:2013-09-14 18:30:30
【问题描述】:

UIAlertView 添加一些控件在iOS7 中使用addSubview 方法已被弃用。据我所知,Apple 承诺添加 contentView 属性。

iOS 7 现在发布了,我看到没有添加这个属性。这就是为什么我搜索一些能够向此警报视图添加进度条的自定义解决方案。例如类似于TSAlertView,但更适合在 iOS 7 中使用。

【问题讨论】:

  • GM 种子是发布的,不是公开发布的。如果需要,请与 Apple 测试并提出错误报告。
  • @Jeremy 正如在 SO 上多次指出的那样,iOS 7 问题并没有离题。当然,任何开发人员都不应该讨论他们同意的 NDA 所涵盖的内容。但 SO 特别不在乎。
  • 现在明确禁止更改 UIAlertView 的视图层次结构。 “UIAlertView 类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。”
  • 从 iOS8 使用 UIAlertController 代替

标签: ios objective-c uialertview ios7


【解决方案1】:

Here is a project on Github 将任何 UIView 添加到 iOS7 上类似 UIAlertView 的对话框。

(复制自this StackOverflow thread。)

【讨论】:

  • +1 为伟大的工作老兄,我将更新我的答案以添加您的真棒控制。
  • 这里有另一个设计的叉子:github.com/kwent/ios-custom-alertview.
  • 这不适用于禁用 ARC。我下午的大部分时间都在尝试修复原始的 github 项目,但无济于事。
  • 感谢@WedgeMartin;确实,这个项目是一个 ARC 项目。不过,你不需要fix原来的,只需在Xcode中设置一个异常:stackoverflow.com/questions/10523816/…
  • @Wimagguc 我已经实现了这个库。一想我解决不了。如何从此自定义 alertview 访问 uiview 、 uibutton 等视图属性?
【解决方案2】:

我只用了 1 天就创建了自己的警报视图,看起来与 Apple 的完全一样

  1. 截取 Apple 警报的屏幕截图以供参考(字体大小、间距、宽度)
  2. 为按钮创建一个带有标题、消息、自定义视图和表格的 xib(Apple 现在使用表格而不是 UIButton,默认表格单元格就足够了)。请注意,您需要 3 个按钮表:左右按钮两个(只要按钮的数量为 2),另一个用于其他情况(一个按钮或超过 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,我使用的是新的弹簧动画方法:

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/视差效果吗?谢谢。安德里亚
  • 我发现这很有帮助。他们为您提供了执行此类操作所需的一切,以及额外能力的选项,我说干得好!
  • George Asda:Sulthan 提供了一个高级清单,说明创建 UIAlertView 克隆时要涵盖的内容。此外,通过不直接共享其他人支付的代码来显示员工的诚信。他根本不需要帮忙。表现出一些尊重。更好的是,创建一个实现并与我们分享......对其他人等。
【解决方案3】:

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


(来源:github.io

【讨论】:

  • @GeorgeAsda:至于您的错误:请提出单独的问题并添加适当的信息和代码。自述文件指示项目需要正确构建哪些文件。不知道你对 Cocoapods 有什么看法,但许多人认为它是获取该项目最新文件的最简单方法。
  • 如果库不支持 cocoapods,我认为它对库来说是一个很大的负面影响,并且非常喜欢它而不是其他一些更手动的添加第三方库的方法。但是对于任何不喜欢它的人来说,如果他们愿意,他们总是可以走艰难的道路。
  • Pods 绝对是要走的路。无视反对者。如果他们不想使用 Pod,手动添加它很简单,我对反 pod 人群的粗鲁感到震惊。
  • @GeorgeAsda “如果其中一个依赖项得到更新并破坏您的项目怎么办???”使用 cocoapods,您可以定义依赖项的版本并将其“冻结”在那里。另一方面,手动复制文件来准确判断您需要哪个版本并不总是那么容易。
  • @Kremk 我只想说我想负责我下载的内容,而不是一些该死的 pod.... 你不必同意我的看法。你只需要接受不同的观点。
【解决方案4】:

适合那些喜欢简单有效的方法而无需编写代码的人。这是一个很酷的解决方案,无需使用任何其他私有框架将子视图添加到 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];
}

希望对大家有所帮助,谢谢:)

【讨论】:

  • 我要求投反对票的人仔细审查答案,并在投反对票之前三思而后行。至少在评论中提供理由是最少的。标准:v
  • 不工作。它在没有 iOS 7 的情况下工作,这意味着 else 条件适用于 addSubviewif 条件不适用于 setValue
  • @Salim 请检查您的 Xcode 版本,iOS 7 在 Xcode 5 及以上版本上可用
  • 很棒的答案。将 UIActivityIndi​​catorView 添加到 UIAlertView 对我来说就像一个魅力。我刚刚用活动指示器更改了 UIImageView
  • 图像大小被忽略。不明白为什么。
【解决方案5】:

对于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 的事情。
【解决方案6】:

在 iOS7 中不会有带有自定义视图的 UIAlertView,也不会有 Apple 改变主意的 contentView,所以 addSubview 现在在 UIAlertView 中是不可能的。

根据 Apple 论坛中的许多帖子,SVProgressHUD 是一个不错的选择。

编辑

iOS7 中正式没有 addSubviewUIAlertView 的子类化。

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

其他不错的选择:

ios-custom-alertview by wimagguc

MZFormSheetController.

【讨论】:

  • 我仍然认为会按承诺添加 contentView,因为在现有应用程序中破坏 UI 是一个愚蠢的决定。
  • 你最好试着想出一个不同的方法。不会有奇迹的。 ;-)
【解决方案7】:

你可以找到没有额外课程的简单解决方案here

它基于为普通UIAlertView设置accessoryView

【讨论】:

    【解决方案8】:

    PKAlertController (https://github.com/goodpatch/PKAlertController) 是一个很棒的库。我测试了很多类似的库,这满足了我的所有要求。

    为什么它很酷:

    • 支持自定义视图
    • 支持iOS7
    • 是视图控制器
    • 它的行为和外观类似于原生警报视图,包括运动效果
    • 可定制
    • 类似 UIAlertController 的界面

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多