【问题标题】:Fitting a UIDatePicker into a UIActionSheet将 UIDatePicker 装入 UIActionSheet
【发布时间】:2010-09-25 21:04:44
【问题描述】:

我正在尝试让带有 UIButton 的 UIDatePicker 显示在 UIActionSheet 中。不幸的是,它被裁剪掉了,整个日期选择器不可见。我什至还没有尝试添加 UIButton。任何人都可以建议让整个视图正确适合吗?我不确定如何添加正确的尺寸,因为 UIActionSheet 似乎缺少 -initWithFrame: 类型构造函数。

UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:@"Date Picker" 
                                                  delegate:self
                                         cancelButtonTitle:@"Cancel"
                                    destructiveButtonTitle:nil
                                         otherButtonTitles:nil];

// Add the picker
UIDatePicker *pickerView = [[UIDatePicker alloc] init];
pickerView.datePickerMode = UIDatePickerModeDate;
[menu addSubview:pickerView];
[menu showInView:self.view];

[pickerView release];
[menu release];

我也尝试过类似的东西:

UIActionSheet *menu = [[UIActionSheet alloc] initWithFrame:CGRectMake(200.0, 200.0, 100.0f, 100.0f)];

坐标当然不现实,但它们似乎不会影响 UIActionSheet 的位置/大小。

【问题讨论】:

  • 这是一个很好的德语example

标签: objective-c iphone cocoa-touch uidatepicker


【解决方案1】:

你可以使用这样的东西(调整坐标):

    UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:@"Date Picker" 
                                                  delegate:self
                                         cancelButtonTitle:@"Cancel"
                                    destructiveButtonTitle:nil
                                         otherButtonTitles:nil];

    // Add the picker
    UIDatePicker *pickerView = [[UIDatePicker alloc] init];
    pickerView.datePickerMode = UIDatePickerModeDate;
    [menu addSubview:pickerView];
    [menu showInView:self.view];    
    [menu setBounds:CGRectMake(0,0,320, 500)];

    CGRect pickerRect = pickerView.bounds;
    pickerRect.origin.y = -100;
    pickerView.bounds = pickerRect;

    [pickerView release];
    [menu release];

但您最好使用 UIDatePicker 和导航栏创建全屏视图。有关示例,请参阅 iPhone DevCenter 中的 UICatalog -> Pickers 示例。

【讨论】:

  • 我试过这种方法,看起来不错,但我发现 UIActionSheet 上的按钮被禁用了。有什么想法吗?
【解决方案2】:

尝试添加以下行来解决禁用按钮问题

[menu sendSubviewToBack:pickerView];

【讨论】:

    【解决方案3】:

    Dmitry 的回答几乎是正确的。但是,actionsheet 的框架太小,因此选择器底部附近的触摸将被忽略。我已经纠正了这些问题:

    UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:@"Date Picker" 
                                                      delegate:self
                                             cancelButtonTitle:@"Cancel"
                                        destructiveButtonTitle:nil
                                             otherButtonTitles:@"OK",nil];    
    // Add the picker
    UIDatePicker *pickerView = [[UIDatePicker alloc] init];
    pickerView.datePickerMode = UIDatePickerModeTime;
    [menu addSubview:pickerView];
    [menu showInView:_mainView];        
    
    CGRect menuRect = menu.frame;
    CGFloat orgHeight = menuRect.size.height;
    menuRect.origin.y -= 214; //height of picker
    menuRect.size.height = orgHeight+214;
    menu.frame = menuRect;
    
    
    CGRect pickerRect = pickerView.frame;
    pickerRect.origin.y = orgHeight;
    pickerView.frame = pickerRect;
    
    [pickerView release];
    [menu release];  
    

    【讨论】:

    • 这对我仍然不起作用。我怀疑我的部分问题是我的应用程序中有一个标签栏。如果我将 menu.frame 再移动 44 像素(标签栏的高度),日期选择器可以完美运行,但菜单底部有 44 像素的间隙。
    • 您在哪个视图中显示 ActionSheet,即。你的 _mainView 是什么?不要在内容视图中显示 ActionSheet,而是在包含内容视图和标签栏的视图中显示它。如果您使用导航控制器,您可能会执行[menu showInView:self.navigationController.view] 之类的操作。
    • 我在屏幕底部遇到了无响应区域,但正在放置 [menu sendSubviewToBack:pickerView];最后解决了所有问题,至少在 iOS5 上对我而言
    • 这个答案太棒了!
    【解决方案4】:

    这对我有用

    NSString *title = UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation) ? @"\n\n\n\n\n\n\n\n\n" : @"\n\n\n\n\n\n\n\n\n\n\n\n" ;
    UIActionSheet *actionSheet = [[UIActionSheet alloc] 
                                  initWithTitle:[NSString stringWithFormat:@"%@%@", title, NSLocalizedString(@"SelectADateKey", @"")]
                                  delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"Ok", nil];
    [actionSheet showInView:self.view];
    UIDatePicker *datePicker = [[[UIDatePicker alloc] init] autorelease];
    datePicker.datePickerMode = UIDatePickerModeDate;
    [actionSheet addSubview:datePicker];
    

    有点棘手,但它有效!

    【讨论】:

    • 在你的标题中添加换行符只是 hacky,但不管你的船是什么,我猜
    【解决方案5】:

    顶部按钮,底部选择器:

     UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:@"Date Picker" 
                                                      delegate:self
                                             cancelButtonTitle:@"Cancel"
                                        destructiveButtonTitle:nil
                                             otherButtonTitles:@"OK",nil];    
    // Add the picker
    UIDatePicker *pickerView = [[UIDatePicker alloc] init];
    pickerView.datePickerMode = UIDatePickerModeTime;
    [menu addSubview:pickerView];
    [menu showInView:_mainView];        
    
    CGRect menuRect = menu.frame;
    menuRect.origin.y -= 214;
    menuRect.size.height = 300;
    menu.frame = menuRect;
    
    
    CGRect pickerRect = pickerView.frame;
    pickerRect.origin.y = 174;
    pickerView.frame = pickerRect;
    
    [pickerView release];
    [menu release];  
    

    【讨论】:

      【解决方案6】:

      确保在 UITabBarController 内时在正确的视图中显示 UIActionSheet 以避免底部的交互问题:

      [actionSheet showInView:self.parentViewController.tabBarController.view];

      【讨论】:

      • 应该是[actionSheet showFromTabBar:self.parentViewController.tabBarController.tabBar]
      【解决方案7】:

      可能不直接回答特定问题(如何让 UIDatePicker 适合),但有关提供 UIDatePicker(以及其他)的 UIActionSheet 的实现,请参阅ActionSheetPicker。来自它的自述文件:

      使用 PickerView 轻松呈现 ActionSheet,允许用户从多个不可变选项中进行选择。基于 mobilesafari 中的 HTML 下拉选项。

      还有:

      一些代码来自 marcio 在 Stack Overflow 上的帖子 [Add UIPickerView & a Button in Action sheet - How?]

      即使你不使用代码,在你自己动手之前阅读也是很好的。


      更新:

      此版本已弃用:改用ActionSheetPicker-3.0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 2012-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多