是否可以在UIAlertView上垂直布置2个按钮?

时间:2012-03-14 13:08:20

标签: ios uialertview

我想用两个按钮创建UIAlertView。我需要垂直布置这些按钮(我的文字太大了)。可能吗 ?

屏蔽1

enter image description here

画面2

enter image description here

9 个答案:

答案 0 :(得分:8)

似乎没有SDK支持此行为。 UIAlertView 中的两个按钮将始终以水平布局显示。

但是,将 UIAlertView 子类化以获得预期的行为非常容易。让我们调用类 VerticalAlertView

以下代码仅适用于带有两个按钮的警报视图,因为 UIAlertView 中的两个以上按钮将自动以垂直布局显示。

VerticalAlertView.h 就像这样简单:

#import <UIKit/UIKit.h>

@interface VerticalAlertView : UIAlertView
@end

VerticalAlertView.m

#import "VerticalAlertView.h"

@implementation VerticalAlertView

- (void)layoutSubviews
{
    [super layoutSubviews];

    int buttonCount = 0;
    UIButton *button1;
    UIButton *button2;

    // first, iterate over all subviews to find the two buttons;
    // those buttons are actually UIAlertButtons, but this is a subclass of UIButton
    for (UIView *view in self.subviews) {
        if ([view isKindOfClass:[UIButton class]]) {
            ++buttonCount;
            if (buttonCount == 1) {
                button1 = (UIButton *)view;
            } else if (buttonCount == 2) {
                button2 = (UIButton *)view;
            }
        }
    }

    // make sure that button1 is as wide as both buttons initially are together
    button1.frame = CGRectMake(button1.frame.origin.x, button1.frame.origin.y, CGRectGetMaxX(button2.frame) - button1.frame.origin.x, button1.frame.size.height);

    // make sure that button2 is moved to the next line,
    // as wide as button1, and set to the same x-position as button1
    button2.frame = CGRectMake(button1.frame.origin.x, CGRectGetMaxY(button1.frame) + 10, button1.frame.size.width, button2.frame.size.height);

    // now increase the height of the (alert) view to make it look nice
    // (I know that magic numbers are not nice...)
    self.bounds = CGRectMake(0, 0, self.bounds.size.width, CGRectGetMaxY(button2.frame) + 15);
}

@end

您现在可以像使用任何其他 UIAlertView

一样使用您的课程
[[[VerticalAlertView alloc] initWithTitle:@"Title" 
                                  message:@"This is an alert message!" 
                                 delegate:self 
                        cancelButtonTitle:@"OK" 
                        otherButtonTitles:@"Second Button", nil] autorelease] show];

您将得到以下结果:

enter image description here

编辑:

使用这种方法有点风险(更不用说hacky),因为Apple可能会在某些时候改变 UIAlertView 的实现,这可能会破坏你的布局。我只想指出,这对您的问题来说是一个简单快捷的解决方案。如 UIAlertView 参考文献中所述:

  

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

答案 1 :(得分:4)

默认情况下不可能。在nycynik的答案中显示的外观是当你有两个以上的按钮时会发生什么。

所以,要么添加另一个按钮,要么可以查看第三方解决方案,例如this library,尽管我还没有测试过。

答案 2 :(得分:1)

UIAlertAction创建UIAlertController时,只需为标题添加一些空格。即使它们在显示时会被修剪,iOS也会垂直放置按钮。

使用4.7“设备在iOS 10.3.1上测试。 即使对于按钮标题1个字符长度,这个空间量也足够了:

NSString* space = @" ";

对于3.5英寸,4英寸和5.5英寸的设备,它很可能也没问题。

答案 3 :(得分:0)

您可以使用包含许多换行符“\ n \ n \ n”的占位符消息来创建所需的空间。比在AlertView顶部添加自定义按钮。这当然是一个黑客 - 不是一个非常可靠的解决方案。但是没有直接的解决方案,只有两个按钮出现在彼此之上。使用三个或更多按钮,无论如何都是默认行为。

答案 4 :(得分:0)

你应该尝试:

UIAlertView *dialog = [[UIAlertView alloc] initWithTitle:@"Warning" message:@"Message"
    delegate:self cancelButtonTitle:@"Ok"  otherButtonTitles:@"Download Next Chapter", nil];
    [dialog show];

答案 5 :(得分:0)

ios 9.0

中, UIAlertview代表 已弃用

此外,当您添加2个以上的按钮时,它们将由IOS垂直分配。

你可以使用简单的UIAlertController

$('button').filter(function(){
  return $(this).data('color')=='yellow';
}).removeClass('active');

IOS 9 Alert with vertical buttons

答案 6 :(得分:0)

是的,它是可能的,它默认出现。 如果添加2个以上的按钮,它将自动进入垂直堆叠,并且您的按钮将在警报中以垂直位置显示。 其次,如果要显示的文本的长度更多,那么即使按钮的计数为2,如果将采用垂直堆栈,则默认情况下也是如此。

理想情况下,屏幕中的警报具有超出它的特定高度和宽度,它将自动调整是否采用水平堆叠或垂直方向的按钮。 虽然您可以创建自定义按钮并提醒显示。

答案 7 :(得分:-3)

是的,这是一个包含代码和页面的页面教程:

http://mobile.tutsplus.com/tutorials/iphone/uialertview/

UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Hello World!"
                                                  message:@"This is your first UIAlertview message."
                                                 delegate:self
                                        cancelButtonTitle:@"Button 1"
                                        otherButtonTitles:@"Button 2", @"Button 3", nil];
[message show];

答案 8 :(得分:-3)

使用此功能:

UIAlertView *alert = [[[UIAlertView alloc] 
                       initWithTitle:@"Title"
                       message:@"Two Vertical Button"
                       delegate:nil
                       cancelButtonTitle:@""
                       otherButtonTitles:@"Button 1", @"Button 2",
                       nil]
                     autorelease];
[[alert viewWithTag:1] removeFromSuperview];
[alert show];