看起来像 UIAlertView 的自定义视图

Posted

技术标签:

【中文标题】看起来像 UIAlertView 的自定义视图【英文标题】:Custom view which looks like UIAlertView 【发布时间】:2013-10-01 14:31:27 【问题描述】:

我需要看起来像 UIAlertView 的东西(相同的背景透明而不是全屏),阻止其他 UI 部分并具有一些自定义内容。 此自定义内容是:两个带有标签的复选框和底部的两个按钮 YES/NO。

子类化或自定义UIAlertView 看起来没有用(参见this answer)而且很危险(代码可能会被Apple 拒绝)。我正在考虑创建自己的自定义UIView(可以使用UIViewController),但我不知道如何让它看起来和感觉像 UIAlertView。我的意思是我想让它根据 ios 版本 (iOS7) 改变其外观。

更新: 我可以放弃 os 版本依赖,拥有它会很好,但这是附加功能。 主要问题是:有没有一种好方法可以让这种视图看起来和感觉像 UIAlertView 而无需大量工作?直接自定义UIAlertView 看起来既复杂又危险。

【问题讨论】:

虽然这是完全可能的,但我建议找到一种侵入性较小且不太复杂的方法来执行此操作。这样的工作量是合理的。 【参考方案1】:

我创建了自己的自定义视图,看起来像 iOS UIAlertView 7。使用该技术,您可以为 iOS 6 和 iOS 7 创建自定义警报。 为此,我在 UIViewController 的 xib 文件中创建了一个 UIView :

我为此视图添加了一些@property:

// Custom iOS 7 Alert View
@property (nonatomic, weak) IBOutlet UIView *supportViewPopup; // My UIView
@property (nonatomic, weak) IBOutlet UIView *supportViewPopupBackground; // The grey view
@property (nonatomic, weak) IBOutlet UIView *supportViewPopupAction; // The white view with outlets
// Property for customize the UI of this alert (you can add other labels, buttons, tableview, etc.
@property (nonatomic, weak) IBOutlet UIButton *buttonOK;
@property (nonatomic, weak) IBOutlet UIButton *buttonCancel;
@property (nonatomic, weak) IBOutlet UILabel *labelDescription;

在我的 viewDidLoad 上:

- (void)viewDidLoad

    [super viewDidLoad];

       // Support View
    self.supportViewPopupAction.layer.cornerRadius = 5.0f;
    self.supportViewPopupAction.layer.masksToBounds = YES;

    // Add Support View
    [self.view addSubview:self.supportViewPopup];

    // Center Support view
    self.supportViewPopup.center = self.view.center;

    // Alpha
    self.supportViewPopup.alpha = 0.0f;
    self.supportViewPopupBackground.alpha = 0.0f;
    self.supportViewPopupAction.alpha = 0.0f;

显示弹出窗口的操作:

- (IBAction)displayPopup

    // Support View
    self.supportViewPopup.alpha = 1.0f;
    self.supportViewPopupBackground.alpha = 0.5f;

    // Animation
    [UIView animateWithDuration:0.5f
                     animations:^
                         self.supportViewPopupAction.alpha = 1.0f;
                     ];

关闭弹出窗口的操作:

- (IBAction)dismissModal

    // Animation
    [UIView animateWithDuration:0.5f
                     animations:^
                         self.supportViewPopup.alpha = 0.0f;
                         self.supportViewPopupBackground.alpha = 0.0f;
                         self.supportViewPopupAction.alpha = 0.0f;
                     ];

因此,您可以使用按钮、表格视图、标签、集合视图等来配置您的supportViewPopupAction...

我花时间写了这个警报视图的例子。希望对您有所帮助!

【讨论】:

但是UILabel 不会像UIAlertView 那样调整自身大小 要做到这一点,您需要使用自动布局和自动调整大小:) 按钮线是怎么做的? 没关系...知道了...额外的视图是...1px宽...聪明...非常聪明... 我一直在寻找更好的解决方案,但看起来每个外观的多个 xib 文件只是好的解决方案。谢谢。【参考方案2】:

自定义视图可以传递给 PXAlertView:https://github.com/alexanderjarvis/PXAlertView

【讨论】:

【参考方案3】:

UIButtons 和 UITextFields 等一些组件的外观会因版本而异,所以没关系,我看到的问题将出现在包含 then 的视图中。

我的建议是检测应用程序正在运行的版本,然后根据该版本绘制警报视图,或者只是创建一个适合两者的自定义设计。

【讨论】:

【参考方案4】:

根据 iOS 版本创建视图!

NSString *version = [[UIDevice currentDevice] systemVersion];
        int major = [version intValue];
        if (major < 7)
            //alert for the iOS 6
    else
    //alert for the iOS 7

【讨论】:

这是检查 iOS 版本的糟糕方式。有更好的方法:NSFoundationVersionNumber 见documentation。无论如何,这种方法需要大量的手动编码。

以上是关于看起来像 UIAlertView 的自定义视图的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式加载自定义子视图,就像它们是单元格一样?

创建一个看起来像优惠券项目的自定义形状背景[关闭]

树视图小部件中的自定义项目

如何防止键盘出现在自定义警报视图上

带有自定义按钮的自定义 UIAlertView

从 XML 布局中的自定义视图中删除包前缀