Можно ли выложить 2 кнопки вертикально на UIAlertView?

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

Screen1

Screen2

 nycynik14 мар. 2012 г., 14:10
а твой код выглядит?

Ответы на вопрос(9)

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];
 Ian L14 мар. 2012 г., 14:19
Сложенные кнопки, как показано в связанном руководстве, состоят из трех кнопок. Voloda2 имеет только две кнопки, поэтому они по умолчанию расположены горизонтально.

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

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

Протестировано на iOS 10.3.1 с 4,7-дюймовым устройством. Этого места достаточно даже для заголовка кнопки длиной 1 символ:

NSString* space = @" ";

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

Решение Вопроса

что происходит, когда у вас более двух кнопок.

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

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

И вы получите следующий результат:

РЕДАКТИРОВАТЬ:

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

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

 Milan Kamilya24 апр. 2014 г., 08:21
Это не работает для iOS 7.0 SDK. Не могли бы вы предложить что-нибудь @Flo
 Flo09 мая 2014 г., 11:57
С iOS 7 Apple сделала практически невозможным создание подкласса UIAlertView, но он никогда не предназначался для создания подкласса. Уже невозможно добавить пользовательские подпредставления к предупреждению, вам придется использовать метод, описанный здесь, чтобы сделать это:stackoverflow.com/a/21067447/378977, Однако, к сожалению, я не нашел решения для двух вертикально расположенных кнопок на iOS 7. Я думаю, что нет никакого способа создать свой собственный класс для этого. Так что, может быть, стоит взглянуть на TSAlertView, как это было предложеноЯн Л и сделать его пригодным для iOS 7.

Использовать это :

                       initWithTitle:@"Title"
                       message:@"Two Vertical Button"
                       delegate:nil
                       cancelButtonTitle:@""
                       otherButtonTitles:@"Button 1", @"Button 2",
                       nil]
                     autorelease];
[[alert viewWithTag:1] removeFromSuperview];
[alert show];
 lindon fox25 окт. 2012 г., 10:12
Это просто создает пустую кнопку Отмена ... и две другие кнопки.
 Mick MacCallum05 окт. 2012 г., 22:39
Чтобы улучшить качество своего ответа, укажите, как / почему ваше сообщение решит проблему.

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

UIAlertview делегаты находятсяосуждается в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];

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

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

Ваш ответ на вопрос