iPad上的UIActionSheet框架太小

13
我正在尝试在iPad上显示一个带有UIPickerView的UIActionSheet,我已经为iPhone编写了等效代码,因此我的UIPickerView委托和数据源都能正常工作,但是当我在iPad上使用-[UIActionSheet showFromRect:inView:animated:]时,结果的UIPopover/UIActionSheet太小了,而且我似乎无法设置框架大小,也没有任何按钮显示。 我不知道这是否是因为它们超出了范围还是因为其他原因。这是我删除所有非必要代码(iPhone等)后的代码样子。有人知道我做错了什么吗?有人知道任何示例吗?
CGRect thePickerFrame = CGRectMake(0, 0, 320.0, 485.0);
UIPickerView * thePickerView = [[UIPickerView alloc] initWithFrame:thePickerFrame];

[pickerActionSheet release], pickerActionSheet =
        [[UIActionSheet alloc] initWithTitle:@"Choose" delegate:self 
                               cancelButtonTitle:@"Cancel"
                               destructiveButtonTitle:nil
                               otherButtonTitles:@"Next", nil];
thePickerView.showsSelectionIndicator = YES;
thePickerView.dataSource = self;
thePickerView.delegate = self;

[pickerActionSheet addSubview:thePickerView];
[thePickerView selectRow:0 inComponent:0 animated:NO];
[thePickerView release];

[pickerActionSheet showFromRect:currentTextField.bounds
                             inView:currentTextField animated:NO];
pickerActionSheet.frame = thePickerFrame;

我刚刚进行了一些实验,以查看何时调用[UIActionSheet setFrame:]。似乎在调用上述方法的事件循环之后,由iOS启动的另一个事件循环会导致使用显示的小框架调用[UIActionSheet setFrame:]。 - Nathan Day
1
你在iPad上使用弹出窗口不是更好吗?据我所知,ActionSheet只适用于按钮。 - Eimantas
2个回答

18

我认为UIActionSheet不可调整大小,尝试在代��中注释掉[pickerActionSheet addSubview:thePickerView];这行,你会发现ActionSheet会完美地适配按钮。

我建议使用带有自定义UIViewControllerUIPopoverController。就像这样:

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

popover是在.h文件中声明的一个类变量(UIPopoverController *popover;)。

顺便提一下,我正在使用ARC,所以代码中没有release。


8

我用了一个比较傻的方法让它工作起来。

供您参考:
设置 PickerView。

UIActionSheet 的宽度无法调整,因此必须相应地调整 pickerView。高度方面,您可以根据 actionSheet 标题中"\n"的数量进行调整。

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

设置帧或边界对我无效。

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



同意使用UIPopoverController,但是不知道为什么,当我把UIDatePickerView放进弹出窗口中时,它有严重的界面延迟(需要近1秒才能弹出),我找不到原因。所以只好回退到上述方法。


愉快的编码。


虽然有些取巧,但这至少在通用应用程序中很容易实现。谢谢! - Rik Smith-Unna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接