改变iPad中UIAlertView的宽度

时间:2010-05-04 08:04:58

标签: iphone uialertview

有没有办法在iPhone或iPad上更改UIAlertView的框架。我尝试在以下委托方法- (void)willPresentAlertView:(UIAlertView *)alertView;

中更改框架

但即便如此,Alertview的宽度仍保持不变。我认为iPad中的一个小型Alertview没有意义。我想必须有办法实现它,至少在iPad中。

谢谢, 克里希南。

5 个答案:

答案 0 :(得分: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 :(得分:4)

如果你只是想用一个大的文本字段和一个ok按钮来改变标准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);

}

答案 2 :(得分:3)

我的提醒视图中没有任何文本字段,当我设置框架或使用转换时,视图的背景框架在设备中呈现得很糟糕。这个东西只能在模拟器中正常工作。

答案 3 :(得分: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
                               );
}

我不知道这是否是最佳方式,但它对我有用。

答案 4 :(得分:0)

分别为iPhone和iPad使用此方法分别为高度和宽度:

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