Как настроить кнопки в UIActionSheet?

Я хочу изменить image of buttons UIActionSheet, у меня images для каждого button, и я хочу, чтобы каждый button показывал image, который я хочу. Я поискал в Интернете и нашел много ответов, но они не помогли.

Вот инициализация UIActionSheet

-(IBAction)showActionSheet:(id)sender {

    UIActionSheet *popupQuery = [[UIActionSheet alloc] initWithTitle:@"title" delegate:self cancelButtonTitle:@"Cancel Button" destructiveButtonTitle:nil otherButtonTitles:@"Other Button 1", @"Other Button 2", nil];
    popupQuery.actionSheetStyle = UIActionSheetStyleDefault;
    [popupQuery showInView:self.view];
    [popupQuery release];

}

person user784625    schedule 04.07.2011    source источник
comment
Посмотрите сообщение SO stackoverflow.com/questions/1858318/   -  person Jhaliya - Praveen Sharma    schedule 04.07.2011
comment
это касается изменения ширины и высоты, и это не мой вопрос, и я не хочу   -  person user784625    schedule 04.07.2011
comment
Ознакомьтесь с созданным мной классом, имитирующим внешний вид UIActionSheet: stackoverflow.com/a/16636736/1901336   -  person Andreas Zöllner    schedule 19.05.2013


Ответы (3)


Я создаю подкласс UIActionSheet, производный от CustomActionSheet, и реализую метод под названием customizeGUI.

Я использую CustomActionSheet, например UIActionSheet, за исключением того, что я должен вызвать метод customizeGUI подкласса в делегате willPresentActionSheet:

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
    if ([actionSheet isKindOfClass:[CustomActionSheet class]]) {
        CustomActionSheet *sheet = (CustomActionSheet*)actionSheet;
        [sheet customizeGUI];
    }
}


(CustomActionSheet.m)

- (void)customizeGUI {
    UIImageView *imgvwBackground = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg_actionsheet.png"]];
    CGRect rect = self.bounds;
    imgvwBackground.frame = rect;
    [self insertSubview:imgvwBackground atIndex:0];
    [imgvwBackground release];

    int buttonIndex = 0;
    UIImage *imgButtonDestructive = [UIImage imageNamed:@"btn_actionsheet_destructive.png"];
    UIImage *imgButtonCancel = [UIImage imageNamed:@"btn_actionsheet_cancel.png"];
    UIImage *imgButtonNormal = [UIImage imageNamed:@"btn_actionsheet_normal.png"];
    for (UIView *sub in self.subviews) {
        NSString *className = [NSString stringWithFormat:@"%@", [sub class]];
        if ( ([className isEqualToString:@"UIThreePartButton"]) //iOS 4
            || ([className isEqualToString:@"UIAlertButton"]) ) { //iOS 5
            rect = sub.frame;
            sub.hidden = YES;

            UIButton *btn = [[UIButton alloc] initWithFrame:rect];
            UIImage *imgForButton = nil;
            if (buttonIndex == self.cancelButtonIndex) {
                imgForButton = imgButtonCancel;
            }
            else if (buttonIndex == self.destructiveButtonIndex) {
                imgForButton = imgButtonDestructive;
            }
            else {
                imgForButton = imgButtonNormal;
            }
            NSString *sTitle = [self buttonTitleAtIndex:buttonIndex];
            btn.titleLabel.font = [UIFont boldSystemFontOfSize:19];
            [btn setBackgroundImage:imgForButton forState:UIControlStateNormal];
            [btn setTitle:sTitle forState:UIControlStateNormal];
            btn.tag = buttonIndex;
            [btn addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];

            [self addSubview:btn];
            [btn release];

            buttonIndex++;
        }
    }
}

- (void)buttonClicked:(id)sender {
    UIButton *btn = sender;
    if ([self.delegate respondsToSelector:@selector(actionSheet:clickedButtonAtIndex:)]) {
        [self.delegate actionSheet:self clickedButtonAtIndex:btn.tag];
    }
    [self dismissWithClickedButtonIndex:btn.tag animated:YES];
}

Надеюсь, этот способ поможет вам и подскажет, как настроить UIActionSheet.

person Cao Huu Loc    schedule 25.03.2012
comment
Я бы не стал делать что-то подобное, так как между обновлениями iOS, скорее всего, произойдет перерыв, и вам просто придется поработать позже. (как видите, у вас уже есть особые случаи для iOS 4 и 5) - person Aaron Ash; 25.06.2012
comment
Пройдет ли это через процесс отклонения в магазине приложений? - person Kaolin Fire; 01.11.2012
comment
Вместо [NSString stringWithFormat: @% @, [подкласс]]; который должен выделять буферы и т.д., используйте NSStringFromClass ([подкласс]) - это более эффективно. - person Charlie Monroe; 24.02.2014

Если вы измените эти размеры, вы не только сделаете свое приложение менее пригодным для использования, но и нарушите правила Apple Human Interface Guidelines, что приведет к отклонению вашего приложения при отправке.

Вот пример использования UiActionsheet от Apple

person Rakesh Bhatt    schedule 04.07.2011

Похоже, вам просто нужно создать свой собственный класс. Я бы рассмотрел подклассы UIView или UIActionSheet. Вокруг есть эти PSD-файлы, которые вы можете получить нужные вам изображения, ожидая защиты авторских прав.

РЕДАКТИРОВАТЬ: если вы в конечном итоге создадите свой собственный класс и какой-нибудь полезный, подумайте о том, чтобы загрузить его на http://cocoacontrols.com/ < / а>

person Sam Jarman    schedule 04.07.2011