2012-03-14 12 views

Odpowiedz

4

Nie jest to domyślnie możliwe. Wygląd pokazany w odpowiedzi nycynika brzmi: co się dzieje, gdy masz więcej niż dwa przyciski.

Tak więc albo dodaj kolejny przycisk, albo możesz przyjrzeć się rozwiązaniu innej firmy, takim jak this library, chociaż tego nie przetestowałem.

-3

Tak, tutaj jest strona z kodem & tutorialu:

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

Ułożone przyciski, jak pokazano w połączonym samouczku, są trzy przyciski. Voloda2 ma tylko dwa przyciski, więc domyślnie są one ułożone poziomo. –

0

Możesz użyć pustej wiadomości z wieloma liniami "\ n \ n \ n", aby utworzyć potrzebne miejsce. Następnie dodaj niestandardowy przycisk na AlertView. To oczywiście hack - niezbyt solidne rozwiązanie. Ale nie ma prostego rozwiązania, by tylko dwa przyciski pojawiały się jeden na drugim. Z trzema przyciskami lub więcej jest to domyślne zachowanie.

0

Należy starać:

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

Użyj tego:

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

Aby poprawić jakość odpowiedzi, podaj, w jaki sposób/dlaczego Twój post rozwiąże problem. –

+0

Spowoduje to utworzenie pustego przycisku Anuluj ... i dwóch innych przycisków. –

8

Wydaje się, że brak wsparcia SDK dla tego zachowania. Dwa przyciski w modelu UIAlertView będą zawsze wyświetlane w układzie poziomym.

Jednak łatwo jest po prostu podklasy UIAlertView, aby uzyskać zamierzone zachowanie. Nazwijmy klasę VerticalAlertView.

Poniższy kod działa tylko w przypadku widoków alertów z dwoma przyciskami, ponieważ więcej niż dwa przyciski w widoku UIAlertView zostaną automatycznie wyświetlone w układzie pionowym.

VerticalAlertView.h jest tak proste, jak to:

#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 

Teraz można korzystać z klasy jak każdy inny UIAlertView:

[[[VerticalAlertView alloc] initWithTitle:@"Title" 
            message:@"This is an alert message!" 
           delegate:self 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:@"Second Button", nil] autorelease] show]; 

I dostaniesz następujący wynik:

enter image description here

EDIT:

Korzystanie z tej metody jest nieco ryzykowne (nie mówiąc o hacky), ponieważ Apple może w pewnym momencie zmienić implementację UIAlertView, co może spowodować uszkodzenie układu. Chciałem tylko wskazać, że byłoby to łatwe i szybkie rozwiązanie twojego problemu. Jak wspomniano w UIAlertView odniesienia:

„Klasa UIAlertView ma być używany jak jest i nie wsparcie instacji hierarchia widok dla tej klasy są prywatne i nie muszą być modyfikowane.”.

+0

To nie działa dla SDK iOS 7.0. Czy mógłbyś zaproponować coś @Flo –

+1

Z iOS 7, Apple uczyniło prawie niemożliwym podklasę UIAlertView, ale nigdy nie miało to być podklasowane. Nie można nawet dodawać niestandardowych subskrybowanych wpisów do alertu, dlatego musisz użyć metody opisanej tutaj, aby to zrobić: http://stackoverflow.com/a/21067447/378977. Niestety nie znalazłem jeszcze rozwiązania dla dwóch pionowo ułożonych przycisków na iOS 7. Myślę, że nie ma możliwości stworzenia własnej niestandardowej klasy. Więc może spoglądać na TSAlertView, jak sugeruje [Ian L] (https: // stackoverflow.com/users/596115/ian-l) i sprawiają, że jest on użyteczny dla iOS 7. – Flo

0

UIAlertView delegaciprzestarzałe w iOS 9.0

także po dodaniu więcej niż 2 przyciski, będą one pionowo nadany przez IOS.

można zrobić z po prostu 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

1

Podczas tworzenia UIAlertAction s dla UIAlertController, po prostu dołączyć jakąś białą przestrzeń do tytułów. Mimo że będą one przycinane podczas wyświetlania, iOS ustawi przyciski w pionie.

Testowane na iOS 10.3.1 4,7" urządzenia Ta ilość miejsca jest wystarczająca nawet dla tytułowej przycisk długości 1 char.

NSString* space = @" ";

Najprawdopodobniej to jest OK dla 3,5" , 4 także urządzenia "i 5,5".

Powiązane problemy