UIActionSheet on iPad frame too small

前端 未结 2 497
傲寒
傲寒 2020-12-31 08:19

I am trying to display a UIActionSheet on the iPad with a UIPickerView in it, I have the equivalent code working for iPhone so my UIPickerVie

相关标签:
2条回答
  • 2020-12-31 08:30

    I managed to make it work using a silly way.

    For your reference:
    Setup PickerView.

    UIActionSheet's width can't be adjusted somehow, so have to adjust pickerView accordingly. Height wise, you can adjust with the amount of "\n" in actionSheet title.

    UIDatePicker * pickerView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 270, 220)];
    pickerView.datePickerMode = UIDatePickerModeDate; 
    
    UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:@"\n\n\n\n\n\n\n\n\n\n\n\n\n" delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles: nil];    
    
    [actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
    [actionSheet addSubview:pickerView];
    [actionSheet showFromRect:button.frame inView:button.superview animated:YES];
    [actionSheet release];
    

    Set Frame or Bound doesn't work for me.

    [actionSheet setBounds:pickerView.frame];   
    [actionSheet setFrame:pickerView.frame];
    



    Agreed on using UIPopoverController, but don't know why, it got a serious UI delay when I put UIDatePickerView into popover (it took almost 1 sec lag to pop up) which I can't find the root cause. So have to fallback to above method.


    Happy Coding.

    0 讨论(0)
  • 2020-12-31 08:46

    I think that UIActionSheet is not resizable, try to comment in your code the line with [pickerActionSheet addSubview:thePickerView]; and you will see that the ActionSheet fits perfecly to the buttons.

    I would recommend a UIPopoverController with a custom UIViewController. Something like this:

    UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    toolbar.barStyle = UIBarStyleDefault;
    
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:self action:@selector(BACK_ACTION:)];
    UIBarButtonItem *chooseButton = [[UIBarButtonItem alloc] initWithTitle:@"Choose" style:UIBarButtonItemStylePlain target:nil action:nil];
    UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStyleBordered target:self action:@selector(NEXT_ACTION:)];
    UIBarButtonItem *fixed1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *fixed2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    
    [toolbar setItems:[NSArray arrayWithObjects:cancelButton, fixed1, chooseButton, fixed2, nextButton, nil]];
    
    UIPickerView    *thePickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, 320, 216)];
    CGRect thePickerFrame = thePickerView.frame;
    thePickerFrame.origin.y = toolbar.frame.size.height;
    [thePickerView setFrame:thePickerFrame];
    
    
    UIView *view = [[UIView alloc] init];
    [view addSubview:thePickerView];
    [view addSubview:toolbar];
    
    UIViewController *vc = [[UIViewController alloc] init];
    [vc setView:view];
    [vc setContentSizeForViewInPopover:CGSizeMake(320, 260)];
    
    popover = [[UIPopoverController alloc] initWithContentViewController:vc];
    
    thePickerView.showsSelectionIndicator = YES;
    thePickerView.dataSource = self;
    thePickerView.delegate = self;
    
    [thePickerView selectRow:0 inComponent:0 animated:NO];
    
    [popover presentPopoverFromRect:currentTextField.bounds inView:currentTextField permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    

    Where popover is a class variable declared in .h (UIPopoverController *popover;).

    By the way, I'm using ARC, so there is no release in the code.

    0 讨论(0)
提交回复
热议问题