UIPicker/UIActionSheet отлично работает на iPhone, но только тонкая линия на iPad

Следующий код отлично работает на iPhone, но не на iPad. Получите только тонкую линию вместо полного представления. Изучали а может что то с ректом для пикера? Все цифры размера кажутся разумными.

    actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil
    cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
    [actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
    CGRect pickerFrame = CGRectMake(0, 40, 0, 0);
    if ( isipad ) pickerFrame = CGRectMake(0, 345, 400, 216);
    pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
    pickerView.showsSelectionIndicator = YES;
    pickerView.dataSource = self;
    pickerView.delegate = self;
    [actionSheet addSubview:pickerView];
    [pickerView release];
    UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray         arrayWithObject:@"Select"]];
    closeButton.momentary = YES; 
    closeButton.frame = CGRectMake(10, 7.0f, 100.0f, 30.0f);
    closeButton.segmentedControlStyle = UISegmentedControlStyleBar;
    closeButton.tintColor = [UIColor blackColor];
    [closeButton addTarget:self action:@selector(dismissActionSheet:)  forControlEvents:UIControlEventValueChanged];
    [actionSheet addSubview:closeButton];
    [closeButton release];
    UISegmentedControl *skipButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Skip Birth Year"]];
    skipButton.momentary = YES; 
    skipButton.frame = CGRectMake(200, 7.0f, 100.0f, 30.0f);
    skipButton.segmentedControlStyle = UISegmentedControlStyleBar;
    skipButton.tintColor = [UIColor blackColor];
    [skipButton addTarget:self action:@selector(skipActionSheet:)   forControlEvents:UIControlEventValueChanged];
    [actionSheet addSubview:skipButton];
    [skipButton release];
    [actionSheet setBounds:CGRectMake(0, 0, self.view.frame.size.width, 216)];
    [actionSheet showInView:self.view];
    [actionSheet setBounds:CGRectMake(0, 0, self.view.frame.size.width, 216)];

person ort11    schedule 28.07.2011    source источник


Ответы (4)


Что ж, заработало, поместив большую часть кода в

    - (void)willPresentActionSheet:(UIActionSheet *)actionSheet

в том числе

    pickerFrame = CGRectMake(0, 0, 320, 214);

И

    initWithTitle:@"\n\n\n\n\n\n\n\n\n\n\n\n\n\n" 

для листа действий. Магия, наверное.

person ort11    schedule 29.07.2011

Это правильно:

CGRect pickerFrame = CGRectMake(0, 40, 0, 0); //This line sets the frame height and width equal to 0.
if ( isipad ) pickerFrame = CGRectMake(0, 345, 400, 216); 

Ваш isipad bool работает нормально?

person Nicolas S    schedule 28.07.2011
comment
Пытался разместить изображение, но нужно еще 2 точки, да ладно, это просто горизонтальная линия шириной около 400. - person ort11; 29.07.2011

Спасибо за ваш пост ort11. Мне нужно было сделать приложение для iPad, и я сделал рабочий код копирования-вставки из приложения для iPhone, и на iPad то же самое: небольшая строка :)

Мои потребности - это только выбор языка, ничего больше.

Вот коды, основанные на вашем ответе:

- (IBAction)btLanguageChooserPressed {
    NSLog(@"btLanguageChooserPressed");


    [self createLanguageSheet];

    // show the sheet: will be invoked the willPresentActionSheet method
    [sheet showInView:self.view];
}

- (void)createLanguageSheet {
    NSLog(@"createLanguageSheet()");

    // hoolly crap, need to initialize the title with: @"\n\n\n\n\n\n\n\n\n\n\n\n\n\n" to get working!!!
    sheet  = [[UIActionSheet alloc] initWithTitle:@"\n\n\n\n\n\n\n\n\n\n\n\n\n\n" 
                                         delegate:self 
                                cancelButtonTitle:nil
                           destructiveButtonTitle:nil
                                otherButtonTitles:nil];

    [sheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];    

}
- (void)willPresentActionSheet:(UIActionSheet *)actionSheet
{
    CGRect pickerFrame =  CGRectMake(0, 0, 320, 216);

    pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
    pickerView.showsSelectionIndicator = YES;
    pickerView.dataSource = self;
    pickerView.delegate = self;

    [sheet addSubview:pickerView];


    // add close button:       
    UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray         arrayWithObject:@"OK"]];
    closeButton.momentary = YES; 
    closeButton.frame = CGRectMake(120, 12, 100, 30);
    closeButton.segmentedControlStyle = UISegmentedControlStyleBar;
    closeButton.tintColor = [UIColor blackColor];
    [closeButton addTarget:self action:@selector(dismissSheet:)  forControlEvents:UIControlEventValueChanged];
    [sheet addSubview:closeButton];

    [sheet setBounds:CGRectMake(0, 0, self.view.frame.size.width, 216)];



    //[sheet showInView:self.view];//already called, why need again?
    //[sheet setBounds:CGRectMake(0, 0, self.view.frame.size.width, 216)];

}

во время выполнения я делаю кеш в переменной:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    NSLog(@"Selected: %@", [arrayLanguages objectAtIndex:row])  ;
    selectedRow = row;
}

и вот финиш:

- (void)dismissSheet:(id)sender {
    [sheet dismissWithClickedButtonIndex:0 animated:YES];    
    NSString* selectedLanguage = [arrayLanguages objectAtIndex:selectedRow];
    NSLog(@"dismissSheet() selectedLanguage: %@",selectedLanguage);


    switch (selectedRow) {
        case 0://English
            imgCurrentLanguage.image = [UIImage imageNamed:@"english.png"];
            break;
        case 1:// Deutsch

            break;
        case 2://Français

            break;
        case 3://Italiano

            break;
        case 4://Español

            break;

        default:
            break;
    }
    // TODO: do the changes in GUI

}

Я не могу переместить этот лист действий из центра экрана в левый нижний угол. Но я пытаюсь...

person Community    schedule 04.04.2012

Я думаю, что это будет самое чистое решение:

@interface MyActionSheet : UIActionSheet

@property (nonatomic, strong) IBOutlet UIView * customView;

@end

@implementation MyActionSheet

-(CGRect)bounds {
    return self.customView.bounds;
}

@end

тогда:

MyActionSheet * s = [[MyActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
s.customView = _auxView;
[s addSubview:_auxView];
person epolyakov    schedule 21.08.2013