изменить ширину UIAlertView в iPad - PullRequest
5 голосов
/ 04 мая 2010

Есть ли способ изменить рамку UIAlertView в iPhone или iPad. Я попытался изменить кадр в следующем методе делегата - (void)willPresentAlertView:(UIAlertView *)alertView;

но даже тогда ширина Alertview осталась неизменной. И я думаю, что небольшое Alertview в iPad не будет иметь смысла. И я думаю, что должен быть способ достичь этого, по крайней мере, в iPad.

Спасибо, Кришнан.

Ответы [ 5 ]

8 голосов
/ 04 мая 2010

Хм, этот код работает нормально (кроме случаев, когда вы пытаетесь уменьшить размер - в этом случае вы можете получить плохой рендеринг):

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

Возможно, вы забыли установить для делегата UIAlertView что-то вроде someAlertView.delegate = self;

ОБНОВЛЕНИЕ & darr;

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

4 голосов
/ 20 октября 2011

это решение, которое вы ищете, если вы просто хотите изменить ширину стандартного 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);

}
3 голосов
/ 22 апреля 2011

Я знаю, что это старый вопрос, но я столкнулся с той же проблемой, и ответы здесь помогли мне. Мне нужно было увеличить поля заголовка и текста сообщения, чтобы разместить больше текста на iPad.

Что я сделал, так это реализовал UIAlertView willPresentAlertView: метод делегата и добавил два объекта UILabel для использования в качестве заголовка и сообщения. Мне удалось настроить размер кадра и происхождение этих двух меток. После получения желаемого размера для текстовых полей я изменяю размер окна оповещения, чтобы разместить новый текст. Затем я перебираю подпредставления окна просмотра предупреждений, чтобы найти кнопку и настроить ее кадр.

- (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
                               );
}

Я не знаю, является ли это лучшим способом сделать это, но у меня это сработало.

3 голосов
/ 28 декабря 2010

Нет текстовых полей в моем окне предупреждений, все же, когда я установил кадр или использовал преобразование, фоновый кадр представления плохо отображался на устройстве Эта вещь будет хорошо работать только в симуляторе.

0 голосов
/ 22 ноября 2011

Используйте этот метод с соответствующей высотой и шириной для iPhone и iPad соответственно:

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