2017-04-27 46 views
5

मैं अपने आईओएस ऐप में एक अस्वीकरण UIAlertView प्रदर्शित कर रहा हूं, लेकिन आईओएस में डिफ़ॉल्ट अलर्टव्यू आकार बहुत छोटा है। मैं इसे बड़ा कैसे बना सकता हूं?मैं आईओएस में यूआईएलर्टव्यू बड़ा कैसे कर सकता हूं?

ऐसा लगता है कि यह सरल होना चाहिए, लेकिन मैंने जो जानकारी खोजी है, उससे ऐसा करने का कोई तरीका प्रतीत नहीं होता है?

संहिता,

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

कस्टम नियंत्रक बनाएं और इसे प्रस्तुत करें। 'UIAlertView' का उपयोग न करें (आप वास्तव में कस्टम दृश्य जोड़ने के लिए' UIAlertView' हैकिंग कर रहे हैं)। – Sulthan

+2

कस्टम व्यू का उपयोग करें, –

+0

उल्लेख नहीं है कि 'UIAlertView' को' UIAlertController' – Losiowaty

उत्तर

0
Apple Documentation के अनुसार

, UIAlertView वर्ग के रूप में-है और उपवर्गीकरण का समर्थन नहीं करता इस्तेमाल किया जा करने का इरादा है। इस वर्ग के लिए दृश्य पदानुक्रम निजी है और इसे संशोधित नहीं किया जाना चाहिए।

अनुकूलित करने के लिए आकार, UIAlertView

के बजाय
+0

उदाहरण कोड कृपया – James

6

पहले JSSAlertView का इस्तेमाल करें, अपने वेब दृश्य के साथ एक दृश्य नियंत्रक बनाने के लिए, यह MyWebViewController फोन करते हैं।

तो फिर तुम यह पेश कर सकते हैं या तो एक पूर्ण स्क्रीन नियंत्रक के रूप में:

MyWebViewController* alertController = [[MyWebViewController alloc] init]; 
alertController.view.backgroundColor = [UIColor.lightGrayColor colorWithAlphaComponent:0.2]; 
alertController.modalPresentationStyle = UIModalPresentationOverFullScreen; 

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

यह एक पूर्ण स्क्रीन नियंत्रक हालांकि है। आपको अपनी सामग्री के लिए केंद्र में एक दृश्य बनाना होगा, उस दृश्य के लिए एक सीमा जोड़ें और सब कुछ semitransparent के आसपास रखें।

तुम भी एक पॉपओवर उपयोग कर सकते हैं:

UIView *sourceView = self.view; 

MyWebViewController* alertController = [[MyWebViewController alloc] init]; 
alertController.modalPresentationStyle = UIModalPresentationPopover; 

alertController.preferredContentSize = 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]; 

प्रतिनिधि भी लागू करने के लिए है:

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

स्रोत दृश्य आमतौर पर बटन जो पॉपओवर खोलता है, लेकिन मैं जनक दृश्य का उपयोग कर रहा यह सुनिश्चित करने के लिए कि पॉपओवर केंद्रित है।

आपको उन बटनों को भी जोड़ना होगा जो स्वचालित रूप से UIAlertView द्वारा जोड़े गए हैं लेकिन यह छोटा होना चाहिए।

-1

UIAlertView आईओएस 9.0 में बहिष्कृत है। आपको UIAlertController का उपयोग करना शुरू करना होगा। मेरे ज्ञान के लिए हम UIAlertController के आकार को बढ़ा सकते हैं। मैंने सभी तरीकों की कोशिश की है।

-1

आपको अपनी तीसरी पार्टी द्वारा कस्टम व्यू बनाना होगा: क्योंकि UIAlertView और UIAlertController फ्रेम समायोजन काम नहीं करता है।

0

उपयोग NSLayoutConstraint और UIAlertController ऊंचाई और चौड़ाई का बनाना निश्चित-आकार।

नीचे उस के लिए कोड है:

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"abcd" message:@"edfg" preferredStyle: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]; 

लेकिन की चौड़ाई UIAlertController तय हो गई है। U12lertController की NSLayoutConstraint चौड़ाई का उपयोग नहीं किया गया।

3

आप एक नया वर्ग यह पूरा करने के बनाने की आवश्यकता होगी:

WebAlertView।ज

#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 

उपयोग कैसे करें:

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

नोट्स:

  • केवल रद्द बटन को लागू किया गया है- आपको यह विचार करना चाहिए कि यदि आप चाहें तो अन्य बटन कैसे कार्यान्वित करें।
  • कुछ भी आपको अपने सुपर व्यू से WebAlertView बनाने से रोकता है, इसलिए इसे ध्यान में रखें। शीर्षक की लंबाई या रद्द करने के लिए कोई लेखांकन भी नहीं है बटन स्ट्रिंग्स।
  • जैसा कि अन्य ने उल्लेख किया है, UIAlertView को बहिष्कृत किया गया है।
  • यदि आप व्यू कंट्रोलर का उपयोग करना चाहते हैं तो सुल्तान ने एक अच्छा जवाब दिया है। मेरा उत्तर बेहतर हो सकता है यदि आप वास्तव में कुछ ऐसा चाहते हैं जो UIAlertView जैसा काम करता हो।
0

आपको ऐसा करने की ज़रूरत नहीं है लेकिन पूरे UIAlertView को स्केल करने के लिए हैक है। UIAlertView हमेशा नई विंडो में प्रदर्शित होता है, और चाल खिड़की को स्केल करना है।

[alert show] 
alert.window.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.3, 1.3); // Must be called after [alert show] 
संबंधित मुद्दे