坚持使用ActionSheetPicker,iOS

时间:2013-02-27 17:40:50

标签: ios uipickerview uiactionsheet picker

对于之前实际使用过UIActionSheetPicker的人来说,这是一个非常有针对性的问题。

我在我的iphone应用程序中使用它,一切都很好,但现在我试图在我的ipad上实现它我遇到了一些问题。

主要问题是在ipad上,如果您愿意,选择器会显示为“气泡”或“信息窗口”,它指向调用它的位置,如按钮,文本字段等。

下面是一个例子:

enter image description here

您可以看到“信息窗口”指向动物按钮。

在我的应用程序中,我有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个像素。

EDIT2


在注意到选择器显示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像素的相同位置。我开始相信这个可能不是改变选择器位置的属性。

有什么想法吗?

2 个答案:

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

在我看来,这个库有一个很大的缺陷,它需要一个原始参数,可以是一个按钮项或一个容器。它要求您查看源代码以理解它,而不是从界面中(有点)明显。