开发者

UIPicker / UIActionSheet works fine on iPhone but only thin line on iPad

The following Code works fine on iPhone, but not on iPad. Only get a thin line instead of the full view. Have been researching and maybe something with the rect for the picker? All size numbers seem to be reasonable.

    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)];


Well, got it to work by putting most of the code in

    - (void)willPresentActionSheet:(UIActionSheet *)actionSheet

including

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

AND

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

for the action sheet. Magic I guess.


Is this correct:

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

Is your isipad bool working ok?


Thanks for your post ort11. I needed to make an iPad app and I did working copy-paste code from iPhone app and on iPad is the same: a small line :)

My needs is a language chooser only, nothing else.

Here are the codes based on your answer:

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

}

at runtime I do a cache in a variable:

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

and here is the finish:

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

}

I am not able to move this actionsheet from the center of the screen to botton- left corner. But I am trying...


I think this would be the cleanest solution :

@interface MyActionSheet : UIActionSheet

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

@end

@implementation MyActionSheet

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

@end

then:

MyActionSheet * s = [[MyActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
s.customView = _auxView;
[s addSubview:_auxView];
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜