2012-03-14 9 views

risposta

4

Non è possibile per impostazione predefinita. L'aspetto mostrato nella risposta di nycynik è ciò che accade quando hai più di due pulsanti.

Quindi, aggiungere un altro pulsante oppure è possibile esaminare una soluzione di terze parti come this library, anche se non l'ho ancora testata.

-3

Sì, qui è una pagina con il codice di & tutorial:

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

I pulsanti impilati come mostrato nell'esercitazione collegata sono perché ci sono tre pulsanti. Voloda2 ha solo due pulsanti, quindi sono impilati orizzontalmente per impostazione predefinita. –

0

È possibile utilizzare un messaggio segnaposto con molte interruzioni di riga "\ n \ n \ n", per creare lo spazio necessario. Di aggiungere un pulsante personalizzato in cima a AlertView. Questo è ovviamente un trucco - non una soluzione molto solida. Ma non esiste una soluzione immediata per la visualizzazione di due soli pulsanti l'uno sull'altro. Con tre pulsanti o più è comunque il comportamento predefinito.

0

Si dovrebbe provare:

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

Utilizzare questa:

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

Per migliorare la qualità della risposta, includi come/perché il tuo post risolverà il problema. –

+0

Questo crea solo un pulsante Annulla vuoto ... e altri due pulsanti. –

8

Non sembra esserci alcun supporto SDK per questo comportamento. Due pulsanti in un UIAlertView verranno sempre visualizzati in un layout orizzontale.

Tuttavia, è abbastanza semplice creare una sottoclasse di UIAlertView per ottenere il comportamento desiderato. Chiamiamo la classe VerticalAlertView.

Il seguente codice funziona solo per le viste di avviso con due pulsanti come più di due pulsanti in un UIAlertView verrà automaticamente visualizzato in un layout verticale.

VerticalAlertView.h è semplice come questo:

#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 

È ora possibile utilizzare la classe come qualsiasi altro UIAlertView:

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

E si otterrà il seguente risultato:

enter image description here

EDIT:

L'utilizzo di questo metodo è un po 'rischioso (per non dire hacky), in quanto Apple potrebbe modificare l'implementazione di UIAlertView a un certo punto, che potrebbe interrompere il layout. Volevo solo sottolineare che questa sarebbe una soluzione facile e veloce per il tuo problema. Come accennato nella UIAlertView di riferimento:

"La classe UIAlertView è destinato ad essere utilizzato come-è e non supporto sottoclassi La gerarchia della vista per questa classe è privato e non deve essere modificato.".

+0

Questo non funziona per iOS 7.0 SDK. Per favore suggerisci qualcosa @Flo –

+1

Con iOS 7, Apple ha reso quasi impossibile sottoclasse UIAlertView, ma non è mai stato concepito per essere sottoclasse comunque. Non è nemmeno possibile aggiungere più visualizzazioni secondarie personalizzate all'avviso, è necessario utilizzare il metodo descritto qui per eseguire questa operazione: http://stackoverflow.com/a/21067447/378977. Tuttavia, sfortunatamente, non ho ancora trovato una soluzione per due pulsanti sovrapposti verticalmente su iOS 7. Penso che non ci sia modo di creare la tua classe personalizzata per questo. Quindi forse hava un'occhiata a TSAlertView come suggerito da [Ian L] (https: // StackOverflow.it/users/596115/ian-l) e renderlo utilizzabile per iOS 7. – Flo

0

UIAlertView delegati sono deprecato in ios 9.0

anche quando si aggiungono più di 2 pulsanti, che verranno assegnati in verticale per IOS.

si può fare con semplicemente 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

Mentre la creazione di UIAlertAction s per UIAlertController, basta aggiungere un po 'di spazio bianco per i titoli. Anche se verranno ritagliati durante la visualizzazione, iOS disporrà i pulsanti verticalmente.

Testato su iOS 10.3.1 con 4.7" dispositivo Questa quantità di spazio è sufficiente anche per un titolo tasto lunghezza di 1 carattere:.

NSString* space = @" ";

Molto probabilmente è OK per 3,5" , 4 "e anche 5,5" dispositivi.

Problemi correlati