5

iPhone または iPad で UIAlertView のフレームを変更する方法はありますか。以下のデリゲートメソッドでフレームを変更してみました- (void)willPresentAlertView:(UIAlertView *)alertView;

それでも、Alertview の幅は変更されませんでした。また、iPad の小さな Alertview では意味がないと思います。そして、少なくともiPadでは、それを達成する方法があるに違いないと思います.

ありがとう、クリシュナン。

4

5 に答える 5

8

うーん、このコードは正常に動作します (ただし、サイズを縮小しようとしている場合を除きます。この場合、レンダリングがうまくいかない可能性があります)。

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

UIAlertViewのデリゲートを次のように設定するのを忘れたのかもしれませんsomeAlertView.delegate = self;

 

更新↓

コードパート:

- (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

于 2010-05-04T08:24:50.870 に答える
4

これは、大きなテキスト フィールドと 1 つの [OK] ボタンで標準の UIAlertView の幅を変更したいだけの場合に探しているソリューションです。私の場合、大量のテキストを含むアラートが必要でした。そして、テキストビューをスクロールしなくても、そのテキストをすべて表示できます。トリックは、内部のビューのすべて/一部の幅を変更する必要があることです。これがアプリの承認に合格する保証はありません。彼らは 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);

}
于 2011-10-19T22:50:49.307 に答える
3

これは古い質問であることは知っていますが、同じ問題に直面していたので、ここでの回答が役に立ちました。iPad でより多くのテキストを表示するために、タイトルとメッセージのテキスト フィールドを拡大する必要がありました。

私が行ったことは、 UIAlertView willPresentAlertView: delegate メソッドを実装し、タイトルとメッセージとして機能する 2 つの UILabel オブジェクトを追加することです。これら 2 つのラベルのフレーム サイズと原点を構成することができました。テキスト フィールドに必要なサイズを取得したら、新しいテキストに対応するためにアラート ビューのサイズを変更します。次に、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
                               );
}

これがこれを行うための最良の方法であるかどうかはわかりませんが、私にとってはうまくいきました。

于 2011-04-21T20:52:55.720 に答える
3

私のアラートビューにはテキストフィールドがありませんが、フレームを設定したり、変換を使用したりすると、デバイスでビューの背景フレームが正しくレンダリングされませんでした。このことは、シミュレーターでのみ正常に機能します。

于 2010-12-28T07:23:45.997 に答える
0

iPhone と iPad のそれぞれの高さと幅でこのメソッドを使用します。

- (void)willPresentAlertView:(UIAlertView *)alertView {
    [alertView setFrame:CGRectMake(5, 20, 300, 420)];
}
于 2011-11-22T07:55:37.187 に答える