Можно ли выложить 2 кнопки вертикально на UIAlertView? - PullRequest
5 голосов
/ 14 марта 2012

Я хочу создать UIAlertView с двумя кнопками. Мне нужно расположить эти кнопки вертикально (мой текст слишком большой). Является ли это возможным ?

Screen1

enter image description here

Screen2

enter image description here

Ответы [ 9 ]

8 голосов
/ 13 мая 2013

Кажется, что 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

EDIT:

Использование этого метода немного рискованно (не говоря уже о хакерстве), так как Apple может изменить реализацию UIAlertView в некоторый момент, что может нарушить ваш макет. Я просто хотел отметить, что это будет легким и быстрым решением вашей проблемы. Как упомянуто в UIAlertView ссылка:

"Класс UIAlertView предназначен для использования как есть и не поддержка подклассов. Иерархия представления для этого класса является частной и не должен быть изменен. "

4 голосов
/ 14 марта 2012

Это невозможно по умолчанию.Внешний вид, показанный в ответе nycynik, - это то, что происходит, когда у вас более двух кнопок.

Итак, либо добавьте еще одну кнопку, либо вы можете найти стороннее решение, такое как эта библиотека , хотя я не проверял это.

1 голос
/ 25 апреля 2017

При создании UIAlertAction s для UIAlertController просто добавьте пробелы к заголовкам. Несмотря на то, что они будут обрезаны при отображении, iOS размещает кнопки вертикально.

Протестировано на iOS 10.3.1 с 4.7 "устройством. Этого количества места достаточно даже для заголовка кнопки длиной 1 символ:

NSString* space = @" ";

Скорее всего, это нормально и для 3,5 ", 4" и 5,5 "устройств.

0 голосов
/ 10 мая 2018

Да, это возможно, и это происходит по умолчанию. Если вы добавите более 2 кнопок, они автоматически будут размещены в вертикальном стеке, а ваши кнопки будут отображаться в вертикальном положении в предупреждении. Во-вторых, если длина текста, который вы хотите отобразить, больше, чем также по умолчанию, если будет брать в вертикальном стеке, даже если количество кнопок равно 2.

В идеале, предупреждение на экране имеет определенную высоту и ширину за его пределами, оно автоматически настраивает, брать ли кнопки в горизонтальном или вертикальном стеке. Хотя вы можете создавать свои собственные кнопки и оповещения для отображения.

0 голосов
/ 11 июня 2016

Делегаты UIAlertview устарели in ios 9.0

Также, когда вы добавите более 2 кнопок, они будут назначаться IOS по вертикали.

вы можете сделать просто с помощью UIAlertController

UIAlertController * alert=   [UIAlertController
                                  alertControllerWithTitle:[[[NSBundle mainBundle] infoDictionary]
                                                            objectForKey:@"CFBundleDisplayName"]
                                  message:@"share via"
                                  preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* fbButton = [UIAlertAction
                                actionWithTitle:@"Facebook"
                                style:UIAlertActionStyleDefault
                                handler:^(UIAlertAction * action)
                                {
                                    // Add your code
                                }];
    UIAlertAction* twitterButton = [UIAlertAction
                                   actionWithTitle:@"Twitter"
                                   style:UIAlertActionStyleDefault
                                   handler:^(UIAlertAction * action)
                                   {
                                       // Add your code

                                   }];
    UIAlertAction* watsappButton = [UIAlertAction
                                    actionWithTitle:@"Whatsapp"
                                    style:UIAlertActionStyleDefault
                                    handler:^(UIAlertAction * action)
                                    {
                                      // Add your code
                                    }];
    UIAlertAction* emailButton = [UIAlertAction
                                    actionWithTitle:@"Email"
                                    style:UIAlertActionStyleDefault
                                    handler:^(UIAlertAction * action)
                                    {

                                        // Add your code
                                    }];
    UIAlertAction* cancelButton = [UIAlertAction
                                  actionWithTitle:@"Cancel"
                                  style:UIAlertActionStyleDefault
                                  handler:^(UIAlertAction * action)
                                  {
                                      //Handel no, thanks button

                                  }];

    [alert addAction:fbButton];
    [alert addAction:twitterButton];
    [alert addAction:watsappButton];
    [alert addAction:emailButton];
    [alert addAction:cancelButton];

    [self presentViewController:alert animated:YES completion:nil];

IOS 9 Alert with vertical buttons

0 голосов
/ 06 августа 2012

Используйте это:

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];
0 голосов
/ 14 марта 2012

Вы должны попробовать:

UIAlertView *dialog = [[UIAlertView alloc] initWithTitle:@"Warning" message:@"Message"
    delegate:self cancelButtonTitle:@"Ok"  otherButtonTitles:@"Download Next Chapter", nil];
    [dialog show];
0 голосов
/ 14 марта 2012

Вы можете использовать сообщение-заполнитель со многими переводами строк "\ n \ n \ n", чтобы создать необходимое пространствоЗатем вы добавляете пользовательскую кнопку поверх AlertView.Это, конечно, взломать - не очень твердое решение.Но не существует прямого решения, чтобы только две кнопки появлялись друг над другом.В любом случае, с тремя или более кнопками это поведение по умолчанию.

0 голосов
/ 14 марта 2012

Да, вот страница с кодом и учебником:

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