2010-05-04 55 views
5

有什麼方法可以在iPhone或iPad中更改UIAlertView的框架。我嘗試更改下面的代理方法中的框架- (void)willPresentAlertView:(UIAlertView *)alertView;在iPad中更改UIAlertView的寬度

但即使如此Alertview的寬度保持不變。而且我認爲iPad中的一個小型Alertview將毫無意義。我想至少在iPad中必須有一種方法來實現它。

謝謝, krishnan。

+0

你有沒有找到一個方法來做到這一點?只是好奇,很多答案在這裏,三年過去了...等。 – Morkrom

回答

8

嗯,這個代碼工作正常(除非,當你試圖減少大小 - 原因在這種情況下,你可以得到一些不好的渲染):

- (void)willPresentAlertView:(UIAlertView *)alertView { 
    alertView.frame = CGRectMake(x, y, width, height); 
} 

也許,你忘了設置UIAlertView的委託喜歡的東西someAlertView.delegate = self;

 

UPDATE   ↓

codepart:

- (IBAction)go:(id)sender { 
    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:nil 
     otherButtonTitles:nil] autorelease]; 
    alert.delegate = self; 
    [alert show]; 
} 

- (void)willPresentAlertView:(UIAlertView *)alertView { 
    alertView.frame = CGRectMake(5.f, 1.f, 100.f, 200.f); 
} 

結果(我的iPod):http://dl.dropbox.com/u/6455784/alert_view_frame.png

+1

我確實設置了代表。 AlertView的高度已更改,但不是寬度。它真的對你有用嗎? – Krishnan

+0

是的。但是,當視圖的寬度對於正確的文本顯示(呈現)來說不是那麼必要時,視圖的背景框架被渲染得很差(框架矩形的左側部分被四捨五入,但是右側不是)。 – kpower

+0

您能否確認您的解決方案有效? astalapista說它不起作用。 – Krishnan

3

沒有文本框存在於我的alertview,仍然當我設置幀或使用變換視圖的背景幀是在設備嚴重渲染。這件事情只會在模擬器中正常工作。

3

我知道這是一個老問題,但我面臨着同樣的問題,這裏的答案幫助了我。 我需要放大標題和消息文本字段以便在iPad上容納更多文本。

我所做的是實現UIAlertView willPresentAlertView:委託方法並添加兩個UILabel對象作爲標題和消息。我不能配置這兩個標籤的幀大小和原點。在獲得文本字段的所需大小後,我調整alertview的大小以容納新文本。然後我遍歷alertview的子視圖來查找按鈕並調整它的框架。

- (void)willPresentAlertView:(UIAlertView *)alertView { 

     // add a new label and configure it to replace the title 
     UILabel *tempTitle = [[UILabel alloc] initWithFrame:CGRectMake(10,20,350, 20)]; 
     tempTitle.backgroundColor = [UIColor clearColor]; 
     tempTitle.textColor = [UIColor whiteColor]; 
     tempTitle.textAlignment = UITextAlignmentCenter; 
     tempTitle.numberOfLines = 1; 
     tempTitle.font = [UIFont boldSystemFontOfSize:18]; 
     tempTitle.text = alertView.title; 
     alertView.title = @""; 
     [alertView addSubview:tempTitle]; 
     [tempTitle release]; 

     // add another label to use as message 
     UILabel *tempLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, 350, 200)]; 
     tempLabel.backgroundColor = [UIColor clearColor]; 
     tempLabel.textColor = [UIColor whiteColor]; 
     tempLabel.textAlignment = UITextAlignmentCenter; 
     tempLabel.numberOfLines = 20; 
     tempLabel.text = alertView.message; 
     [alertView addSubview:tempLabel]; 

     // method used to resize the height of a label depending on the text height 
     [self setUILabel:tempLabel withMaxFrame:CGRectMake(10,50, 350, 300) withText:alertView.message]; 
     alertView.message = @""; 

     // set the frame of the alert view and center it 
     alertView.frame = CGRectMake(CGRectGetMinX(alertView.frame) - (370 - CGRectGetWidth(alertView.frame))/2 , 
            alertView.frame.origin.y, 
            370, 
            tempLabel.frame.size.height + 120); 


     // iterate through the subviews in order to find the button and resize it 
     for(UIView *view in alertView.subviews) 
     { 
      if([[view class] isSubclassOfClass:[UIControl class]]) 
      { 
       view.frame = CGRectMake (view.frame.origin.x+2, 
              tempLabel.frame.origin.y + tempLabel.frame.size.height + 10, 
              370 - view.frame.origin.x *2-4, 
              view.frame.size.height); 
      } 
     } 

     [tempLabel release]; 
} 

,並用於調整標籤的方法:

- (void)setUILabel:(UILabel *)myLabel withMaxFrame:(CGRect)maxFrame withText:(NSString *)theText{ 
    CGSize stringSize = [theText sizeWithFont:myLabel.font constrainedToSize:maxFrame.size lineBreakMode:myLabel.lineBreakMode]; 
    myLabel.frame = CGRectMake(myLabel.frame.origin.x, 
           myLabel.frame.origin.y, 
           myLabel.frame.size.width, 
           stringSize.height 
           ); 
} 

我不知道這是否是這樣做的最好的方式,但它爲我工作。

+0

是的它在ios7之前工作,但對於IOS 7它不工作。 – UserDev

4

這是您尋找的解決方案,如果您只是想改變標準UIAlertView的寬度和大的文本字段和一個確定按鈕。就我而言,我只是想要一個帶有大量文本的提醒。並且無需滾動textview即可看到所有文字。 訣竅是你必須改變裏面所有/一些視圖的寬度。 沒有保證,這將通過應用程序的批准。他們可能會找到UIAlertTextView並拒絕它。

#define ALERT_VIEW_WIDTH 600 
#define ALERT_PADDING 20 
-(void) willPresentAlertView:(UIAlertView*) alertView 
{ 
    id thing; 
    int center=alertView.center.x-ALERT_VIEW_WIDTH/2; 
    for (thing in alertView.subviews) 
    { 
     NSLog(@"%@", [[thing class] description]); 
     if([[[thing class] description] isEqualToString:@"UIAlertTextView"]) 
     { 
      UIView* v=(UIView*)thing; 
      v.frame=CGRectMake(v.frame.origin.x+ALERT_PADDING, v.frame.origin.y, ALERT_VIEW_WIDTH-ALERT_PADDING*3, 250); 
     } 
     if([[[thing class] description] isEqualToString:@"UIThreePartButton"]) 
     { 
      UIView* v=(UIView*)thing; 
      v.frame=CGRectMake(v.frame.origin.x+ALERT_PADDING, v.frame.origin.y, ALERT_VIEW_WIDTH-ALERT_PADDING*3, v.frame.size.height); 
     } 
    } 
    alertView.frame=CGRectMake(center, alertView.frame.origin.y, ALERT_VIEW_WIDTH, 360); 

} 
+0

你有沒有得到你使用過的應用程序的批准? –

0

使用此方法與相應的高度和寬度分別爲iPhone和iPad:

- (void)willPresentAlertView:(UIAlertView *)alertView { 
    [alertView setFrame:CGRectMake(5, 20, 300, 420)]; 
}