对于之前实际使用过UIActionSheetPicker的人来说,这是一个非常有针对性的问题。
我在我的iphone应用程序中使用它,一切都很好,但现在我试图在我的ipad上实现它我遇到了一些问题。
主要问题是在ipad上,如果您愿意,选择器会显示为“气泡”或“信息窗口”,它指向调用它的位置,如按钮,文本字段等。
下面是一个例子:
您可以看到“信息窗口”指向动物按钮。
在我的应用程序中,我有4个不同的按钮。 2位于屏幕的顶部,2位于底部。
位于底部的人,非常好地打电话给选择器,选择器出现在指向它们的按钮顶部。
然而,屏幕顶部的那些(几乎就像图片中的那个)当他们调用选择器时,选择器在屏幕上显得更低并且没有指向它们,因为它应该...
我的意思是我希望它出现在指向它们的按钮下面(就像在图像中一样),但它们几乎位于屏幕的中心,指向哪里..
有什么想法吗?有人曾经经历过这个吗?
一开始,我在按钮操作中调用ActionSheetPicker,如下所示:
- (IBAction)selectTopic:(UIControl *)sender {
[ActionSheetStringPicker showPickerWithTitle:NSLocalizedString(@"CHOOSE_TOPIC", nil) rows:self.topics initialSelection:self.selectedIndex target:self successAction:@selector(topicWasSelected:element:) cancelAction:@selector(actionPickerCancelled:) origin:sender];
//when user picks a new topic we clean the titleField to make sure selected title of previous topic doesnt mix up with new topic
titleField.text = @"";
}
现在我试着这样称呼它:
- (IBAction)selectTopic:(UIControl *)sender {
ActionSheetStringPicker *thePicker = [[ActionSheetStringPicker alloc] initWithTitle:NSLocalizedString(@"CHOOSE_TOPIC", nil) rows:self.topics initialSelection:self.selectedIndex target:self successAction:@selector(topicWasSelected:element:) cancelAction:@selector(actionPickerCancelled:) origin:sender];
thePicker.presentFromRect = topicField.frame;
[thePicker showActionSheetPicker];
//when user picks a new topic we clean the titleField to make sure selected title of previous topic doesnt mix up with new topic
titleField.text = @"";
}
其中topicField是我的TextField。
可悲的是结果是一样的。即使现在我指定了我想要箭头指向的位置,选择器也被称为300像素。
奇怪的是,即使使用另一个比之前略低的按钮,拾取器也会下降300个像素。
在注意到选择器显示300像素后,我决定手动使其显示300像素,指向我的按钮。
我使用了以下代码:
- (IBAction)selectTopic:(UIControl *)sender {
//[ActionSheetStringPicker showPickerWithTitle:NSLocalizedString(@"CHOOSE_TOPIC", nil) rows:self.topics initialSelection:self.selectedIndex target:self successAction:@selector(topicWasSelected:element:) cancelAction:@selector(actionPickerCancelled:) origin:sender];
ActionSheetStringPicker *thePicker = [[ActionSheetStringPicker alloc] initWithTitle:NSLocalizedString(@"CHOOSE_TOPIC", nil) rows:self.topics initialSelection:self.selectedIndex target:self successAction:@selector(topicWasSelected:element:) cancelAction:@selector(actionPickerCancelled:) origin:sender];
CGRect pickerFrame = topicField.frame;
pickerFrame.size.height -= 300;
thePicker.presentFromRect = pickerFrame;
[thePicker showActionSheetPicker];
//when user picks a new topic we clean the titleField to make sure selected title of previous topic doesnt mix up with new topic
titleField.text = @"";
}
令人惊讶的是,按钮再次出现在300像素的相同位置。我开始相信这个可能不是改变选择器位置的属性。
有什么想法吗?
答案 0 :(得分:1)
在您的调用代码中设置presentFromRect不会有所作为,因为它将根据ActionSheetPicker代码中的sender
重置,而您将需要修改库的源代码
github上的以下(未合并)提交应解决问题On iPad, set the popover to point properly at its container.
基本上在AbstractActionSheetPicker.m
文件中修改- (void)presentPickerForView:(UIView *)aView
方法,如下所示
- (void)presentPickerForView:(UIView *)aView {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
self.presentFromRect = CGRectMake(0, 0, self.containerView.frame.size.width, self.containerView.frame.size.height);
[self configureAndPresentPopoverForView:aView];
}
else {
self.presentFromRect = aView.frame;
[self configureAndPresentActionSheetForView:aView];
}
}
答案 1 :(得分:0)
在简要查看代码之后,我想说你要确保ActionPicker对象上的presentFromRect位于你在init上传入的容器的坐标中。例如,如果我有一个包含按钮的大视图:
这是未经测试的:
UIView* someBigView = ... // get the big view
UIButton* someButton = ... // get the button that the big view contains
ActionSheetDatePicker* thePicker = [[ActionSheetDatePicker alloc] initWithTitle:@"Some Title"
datePickerMode:UIDatePickerModeDate
selectedDate:[NSDate date]
target:self
action:@selector(someMethod:)
origin:someBigView];
//the arrow should be pointing at the button
thePicker.presentFromRect = someButton.frame;
[thePicker showActionSheetPicker];
在我看来,这个库有一个很大的缺陷,它需要一个原始参数,可以是一个按钮项或一个容器。它要求您查看源代码以理解它,而不是从界面中(有点)明显。