¿Cómo puedo hacer que un UIAlertView sea más grande en iOS?

Estoy mostrando una exención de responsabilidad UIAlertView en mi aplicación iOS, pero el tamaño pnetworkingeterminado de AlertView en iOS es muy pequeño. ¿Cómo puedo hacerlo más grande?

Parece algo que debería ser simple, pero ¿a partir de qué información he buscado no parece haber una forma de hacerlo?

Código,

UIAlertView* alert = [[UIAlertView alloc] initWithTitle: @"Disclaimer" message: nil delegate: self cancelButtonTitle: @"Accept" otherButtonTitles: nil]; UIWebView* webView = [[UIWebView alloc] init]; [webView setFrame:CGRectMake(0, 0, 280, 140)]; [webView loadHTMLString: html baseURL: nil]; UIView* view = [[UIView alloc] initWithFrame: CGRectMake(0, 0, 280, 140)]; [view addSubview: webView]; [alert setValue: view forKey: @"accessoryView"]; [alert show]; 

Primero, cree un controller de vista con su vista web, llamémoslo MyWebViewController .

Entonces puede presentarlo como un controller de pantalla completa:

 MyWebViewController* alertController = [[MyWebViewController alloc] init]; alertController.view.backgroundColor = [UIColor.lightGrayColor colorWithAlphaComponent:0.2]; alertController.modalPresentationStyle = UIModalPresentationOverFullScreen; [self presentViewController:alertController animated:YES completion:nil]; 

Sin embargo, este es un controller de pantalla completa. Tendrá que crear una vista en el centro para su contenido, agregar un borde para esa vista y mantener todo alnetworkingedor semitransparente.

También puedes usar un popover:

 UIView *sourceView = self.view; MyWebViewController* alertController = [[MyWebViewController alloc] init]; alertController.modalPresentationStyle = UIModalPresentationPopover; alertController.prefernetworkingContentSize = CGRectInset(self.view.bounds, 20, 100).size; alertController.popoverPresentationController.canOverlapSourceViewRect = YES; alertController.popoverPresentationController.sourceView = sourceView; alertController.popoverPresentationController.sourceRect = CGRectMake(CGRectGetMidX(sourceView.bounds), CGRectGetMidY(sourceView.bounds), 0, 0); alertController.popoverPresentationController.permittedArrowDirections = 0; alertController.popoverPresentationController.delegate = self; [self presentViewController:alertController animated:YES completion:nil]; 

El delegado también debe implementar:

 - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection { return UIModalPresentationNone; } 

La vista de origen suele ser el button que abre el popover, pero estoy usando la vista principal para garantizar que el popover esté centrado.

También tendrá que agregar los botones que UIAlertView agrega automáticamente pero que deberían ser triviales.

Necesitarás crear una nueva class para lograr esto:

WebAlertView.h

 #import <UIKit/UIKit.h> @interface WebAlertView : UIView - (id)initWithTitle:(NSString *)title webView:(UIWebView *)webView delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle; - (void)show; @end @protocol WebAlertViewDelegate <NSObject> @optional - (void)webAlertViewCancel:(WebAlertView *)alertView; @end 

WebAlertView.m

 #import "WebAlertView.h" @interface WebAlertView() @property (weak, nonatomic) UIWebView *webView; @property (weak, nonatomic) NSString *title; @property (weak, nonatomic) NSString *cancelButtonTitle; @property (weak, nonatomic) id delegate; @property (strong, nonatomic) UIView *curtainView; @end @implementation WebAlertView - (id)initWithTitle:(NSString *)title webView:(UIWebView *)webView delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle { CGFloat titleViewHeight = 64.0; CGFloat cancelButtonHeight = 44.0; if ((self = [super initWithFrame:CGRectMake(0, 0, webView.frame.size.width, webView.frame.size.height+titleViewHeight+cancelButtonHeight)])) { self.backgroundColor = [UIColor groupTableViewBackgroundColor]; _webView = webView; _title = title; _cancelButtonTitle = cancelButtonTitle; _delegate = delegate; CGRect titleViewFrame = self.frame; titleViewFrame.size.height = titleViewHeight; UILabel *label = [[UILabel alloc] initWithFrame:titleViewFrame]; label.text = title; label.font = [UIFont boldSystemFontOfSize:16.0]; label.textAlignment = NSTextAlignmentCenter; [self addSubview:label]; CGRect webViewFrame = _webView.frame; webViewFrame.origin.y = titleViewHeight; _webView.frame = webViewFrame; [self addSubview:_webView]; CGRect cancelButtonFrame = self.frame; cancelButtonFrame.size.height = cancelButtonHeight; cancelButtonFrame.origin.y = self.frame.size.height - cancelButtonHeight; UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; button.frame = cancelButtonFrame; [button setTitle:cancelButtonTitle forState:UIControlStateNormal]; button.titleLabel.font = [UIFont boldSystemFontOfSize:16.0]; [button addTarget:self action:@selector(buttonTouchUpInside) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:button]; } return self; } - (void)show { if ([_delegate isKindOfClass:[UIViewController class]]) { UIViewController *delegateViewController = (UIViewController *)_delegate; if (!_curtainView) { _curtainView = [[UIView alloc] initWithFrame:delegateViewController.view.bounds]; _curtainView.backgroundColor = [UIColor blackColor]; _curtainView.alpha = 0.5; } [delegateViewController.view addSubview:_curtainView]; self.center = delegateViewController.view.center; [delegateViewController.view addSubview:self]; } } - (void)drawRect:(CGRect)rect { self.layer.cornerRadius = 16.0; self.clipsToBounds = YES; } - (void)buttonTouchUpInside { [_curtainView removeFromSuperview]; [self removeFromSuperview]; if([_delegate respondsToSelector:@selector(webAlertViewCancel:)]) { [_delegate webAlertViewCancel:self]; } } @end 

Cómo utilizar:

 UIWebView* webView = [[UIWebView alloc] init]; [webView setFrame:CGRectMake(0, 0, 280, 140)]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.com"]]; [webView loadRequest:urlRequest]; WebAlertView *webAlertView = [[WebAlertView alloc] initWithTitle:@"Disclaimer" webView:webView delegate:self cancelButtonTitle:@"Accept"]; [webAlertView show]; 

Notas:

  • Solo el button de cancelación implementado: debería darle una idea de cómo implementar otros botones si lo desea.
  • Nada te impide hacer que WebAlertView sea más grande que su súper vista, así que ten esto en count. Tampoco se tiene en count la longitud de las cadenas title o cancelButton.
  • Como otros han mencionado, UIAlertView está en desuso.
  • Sulthan ha dado una buena respuesta si desea usar un ViewController. Mi respuesta puede ser mejor si realmente quieres algo que funcione como UIAlertView.

De acuerdo con la documentation de Apple , la class UIAlertView está diseñada para ser utilizada tal cual y no admite subclasss. La jerarquía de vista para esta class es privada y no debe modificarse.

Para personalizar el tamaño, utilice JSSAlertView en lugar de UIAlertView

Use NSLayoutConstraint y haga el ancho y el ancho del tamaño fijo de UIAlertController .

A continuación hay un código para eso:

 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"abcd" message:@"edfg" prefernetworkingStyle:UIAlertControllerStyleAlert]; UIAlertAction *action = [UIAlertAction actionWithTitle:@"Done" style:UIAlertActionStyleDefault handler:nil]; [alert addAction:action]; NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:alert.view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:self.view.frame.size.height * 0.8]; NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:alert.view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier:1 constant:self.view.frame.size.width * 0.5]; [alert.view addConstraint:width]; [alert.view addConstraint:height]; [alert.view setBackgroundColor:[UIColor blackColor]]; [self presentViewController:alert animated:YES completion:nil]; 

Pero el ancho de UIAlertController es fijo. No se ha cambiado el ancho NSLayoutConstraint de UIAlertController.

No se supone que hagas eso, pero hay un truco para escalar todo el UIAlertView. UIAlertView siempre se muestra en una window nueva, y el truco consiste en escalar la window.

 [alert show] alert.window.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.3, 1.3); // Must be called after [alert show] 

UIAlertView está en desuso en iOS 9.0. Debe comenzar a usar UIAlertController. Que yo sepa, podemos boost el tamaño de UIAlertController. He probado todas las forms.

tiene que crear Custom View por propio tercero: porque en UIAlertView y UIAlertController , el ajuste de ttwig no funciona.