底部弹出的UIPicker?

3

当调用某个操作时,从屏幕底部弹出的 UIPicker 只是一个基本的 UIPickerView,并以特定的方式协调吗?(就像 UIActionSheet 一样?)我该如何实现它?


我创建了一个小的示例。已将链接添加到我的帖子中。 - kovpas
4个回答

4

这是我使用的动画代码:

- (void)animateDatePicker:(BOOL)show {
    CGRect screenRect = self.frame;
    CGSize pickerSize = [self.datePickerView sizeThatFits:CGSizeZero];
    CGRect startRect = CGRectMake(0.0,
                                  screenRect.origin.y + screenRect.size.height,
                                  pickerSize.width, pickerSize.height);

    CGRect pickerRect = CGRectMake(0.0,
                                   screenRect.origin.y + screenRect.size.height - pickerSize.height,
                                   pickerSize.width,
                                   pickerSize.height);

    self.datePickerView.frame = pickerRect;
    self.backgroundColor = UIColorMakeRGBA( 64, 64, 64, 0.7f - (int)show * 0.7f );

    if ( show ) {
        self.datePickerView.frame = startRect;
        [self.parentViewController addSubviewToWindow:self];
    }

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.3f];
    [UIView setAnimationDelegate:self];

    self.backgroundColor = UIColorMakeRGBA( 64, 64, 64, 0.0f + (int)show * 0.7f );

    if ( show ) {
        self.datePickerView.frame = pickerRect;
    } else {
        [UIView setAnimationDidStopSelector:@selector(slideDownDidStop)];
        self.datePickerView.frame = startRect;
    }

    [UIView commitAnimations];  
}

datePickerView是一个包含DatePicker的视图:

self.datePickerView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 174.0, 320.0, 286.0)];
self.datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0.0, 70.0, 320.0, 216.0)];
[self.datePicker setDatePickerMode:UIDatePickerModeDate];
[self.datePicker addTarget:self action:@selector(pickerValueChanged:) forControlEvents:UIControlEventValueChanged];
[self.datePickerView addSubview:self.datePicker];

parentViewController应该实现addSubviewToWindow方法:

- (void)addSubviewToWindow:(UIView *)addView {
    [self.view addSubview:addView];
}

UIColorMakeRGBA:

#define UIColorMakeRGBA(nRed, nGreen, nBlue, nAlpha) [UIColor colorWithRed:(nRed)/255.0f green:(nGreen)/255.0f blue:(nBlue)/255.0f alpha:nAlpha]

slideDownDidStop是一个方法,当日期选择器成功下滑后将被调用。
因此,简而言之 - 您有一个名为MyViewController的控制器,其中包含
MyDatePickerView *myDatePicker;

字段。

MyDatePickerView 是一个自定义类,拥有一个 UIDatePicker *datePicker 字段、一个 MyViewController *parentViewController 和一个 animateDatePicker 方法。

当您在 MyViewController 上执行某些操作(例如,为某个按钮的 UIControlEventTouchUpInside 事件),您应该调用

[myDatePicker animateDatePicker:YES];

如果您有问题,请告诉我。

更新: 这里有一个小示例


哇,感谢您的代码 - 那一定是很多工作。不幸的是,我不太明白如何实现它。我创建了一个基本的视图应用程序,并添加了另一个名为MyDatePickerView的UIViewController。我假设它应该从主视图中调用。我复制了上面的所有代码,并在该视图中声明了该方法,但不确定如何实现其余部分。 - startuprob

0

将UIPickerView放入新的UIViewController类中(我们称之为PopupUIPicker),然后通过以下方式显示该视图控制器:

PopupUIPicker *pickerController = [[[PopupUIPicker alloc] init] autorelease];
[currentViewController presentModalViewController:pickerController animated:YES];

其中currentViewController是您要在其上显示它的视图控制器。 要关闭它:

[currentViewController dismissModalViewControllerAnimated:YES];

默认的动画是从底部向上滑动。您可以像这样更改:

pickerController.modalTransitionStyle = UIModalTransitionStylePartialCurl;

这将添加一个全新的视图。我的目的是在屏幕底部弹出uiPicker。(这与点击Facebook应用程序右上角的“实时供稿”按钮时发生的情况相同。) 会弹出一个小uiPicker,但不会覆盖整个页面。 - startuprob
你不必让视图占据整个框架。 - Matt Williamson

0

我和Rob一样也遇到了同样的问题...我可以使UIPicker弹出...但它会填满整个屏幕...我只想让选择器弹出...Matt说您不必使视图占据整个框架...仅调整视图大小是行不通的...您如何让只有选择器弹出?我仍然希望看到父视图的部分...就像iPhone上的Safari处理下拉菜单一样。


0
你说的"当调用操作时从屏幕底部弹出的 UIPicker"是什么意思?
如果你想做类似 Facebook 应用的功能,可以查看他们的开源 UI 库 Three20(不能保证他们使用的组件在里面,我没有检查过)。

通常情况下,UIPickerView占据屏幕的大约一半空间 - 这取决于开发人员放置的位置。Facebook应用程序使UIPickerView从底部弹出(就像UIActionSheet一样),但它不会覆盖整个屏幕。 - startuprob

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