Sag*_*ari 120 iphone uipickerview ios actionsheetpicker
我的应用程序需要在操作表中添加以下内容.
我已经包含了一张图片来了解我的要求.
能否解释一下,如何实施?
mar*_*cio 111
还有一个解决方案
没有工具栏但是分段控件(eyecandy)
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:nil
cancelButtonTitle:nil
destructiveButtonTitle:nil
otherButtonTitles:nil];
[actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
CGRect pickerFrame = CGRectMake(0, 40, 0, 0);
UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
pickerView.showsSelectionIndicator = YES;
pickerView.dataSource = self;
pickerView.delegate = self;
[actionSheet addSubview:pickerView];
[pickerView release];
UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Close"]];
closeButton.momentary = YES;
closeButton.frame = CGRectMake(260, 7.0f, 50.0f, 30.0f);
closeButton.segmentedControlStyle = UISegmentedControlStyleBar;
closeButton.tintColor = [UIColor blackColor];
[closeButton addTarget:self action:@selector(dismissActionSheet:) forControlEvents:UIControlEventValueChanged];
[actionSheet addSubview:closeButton];
[closeButton release];
[actionSheet showInView:[[UIApplication sharedApplication] keyWindow]];
[actionSheet setBounds:CGRectMake(0, 0, 320, 485)];
Run Code Online (Sandbox Code Playgroud)Tim*_*nel 75
即使这个问题很老,我也会很快提到我已经将ActionSheetPicker类与一个便利函数放在一起,因此你可以在一行中生成一个带有UIPickerView的ActionSheet.它基于此问题答案的代码.
编辑:它现在还支持使用DatePicker和DistancePicker.
Sag*_*ari 32
是的!我终于找到了.
在按钮单击事件上实现以下代码,以弹出问题图像中给出的操作表.
UIActionSheet *aac = [[UIActionSheet alloc] initWithTitle:@"How many?"
delegate:self
cancelButtonTitle:nil
destructiveButtonTitle:nil
otherButtonTitles:nil];
UIDatePicker *theDatePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0.0, 44.0, 0.0, 0.0)];
if(IsDateSelected==YES)
{
theDatePicker.datePickerMode = UIDatePickerModeDate;
theDatePicker.maximumDate=[NSDate date];
}else {
theDatePicker.datePickerMode = UIDatePickerModeTime;
}
self.dtpicker = theDatePicker;
[theDatePicker release];
[dtpicker addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged];
pickerDateToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
pickerDateToolbar.barStyle = UIBarStyleBlackOpaque;
[pickerDateToolbar sizeToFit];
NSMutableArray *barItems = [[NSMutableArray alloc] init];
UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
[barItems addObject:flexSpace];
UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(DatePickerDoneClick)];
[barItems addObject:doneBtn];
[pickerDateToolbar setItems:barItems animated:YES];
[aac addSubview:pickerDateToolbar];
[aac addSubview:dtpicker];
[aac showInView:self.view];
[aac setBounds:CGRectMake(0,0,320, 464)];
Run Code Online (Sandbox Code Playgroud)
Kyl*_*egg 25
iOS 7更新
UIActionSheet的Apple文档:UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy
我建议不要尝试自定义ActionSheet的内容,因为它可能会导致iOS 7中出现严重的无效上下文错误.我只花了几个小时来解决这个问题,最终决定采取不同的方法.我用一个包含简单tableview的模态视图控制器替换了调用以显示操作表.
有很多方法可以实现这一目标.这是我刚刚在当前项目中实现的一种方式.这很好,因为我可以在5到6个不同的屏幕之间重复使用它,我所有用户都可以从选项列表中进行选择.
SimpleTableViewController
.SimpleTableViewControllerDelegate
使用所需方法创建协议itemSelectedatRow:
,并使用名为delegate of type的弱属性id<SimpleTableViewControllerDelegate>
.这是我们将选择传递回父控制器的方式.itemSelectedatRow:
在tableView:didSelectRowAtIndexPath:
.这种方法具有可公平重用的额外好处.要使用,请在ViewController.h中导入SimpleTableViewController类,符合SimpleTableViewDelegate,并实现该itemSelectedAtRow:
方法.然后,打开模态只是实例化一个新的SimpleTableViewController,设置表数据和委托,并呈现它.
UINavigationController *navigationController = (UINavigationController *)[self.storyboard instantiateViewControllerWithIdentifier:@"SimpleTableVC"];
SimpleTableViewController *tableViewController = (SimpleTableViewController *)[[navigationController viewControllers] objectAtIndex:0];
tableViewController.tableData = self.statesArray;
tableViewController.navigationItem.title = @"States";
tableViewController.delegate = self;
[self presentViewController:navigationController animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
我创建了一个简单的示例并将其发布在github上.
小智 10
Marcio对这个问题的出色解决方案对我在UIActionSheet中添加任何类型的子视图非常有帮助.
由于我尚未完全清楚的原因,UIActionSheet的界限只能在显示之后设置; sagar和marcio的解决方案都成功地通过setBounds:CGRectMake(...)消息在显示后发送到动作表来解决这个问题.
但是,在显示工作表之后设置UIActionSheet边界会在ActionSheet显示时创建一个跳转过渡,它会"弹出"到视图中,然后仅在最后40个像素左右滚动.
在添加子视图后调整UIPickerView的大小时,我建议将发送到动画块内的actionSheet的setBounds消息包装起来.这将使actionSheet的入口显得更加平滑.
UIActionSheet *actionSheet = [[[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
// add one or more subviews to the UIActionSheet
// this could be a UIPickerView, or UISegmentedControl buttons, or any other
// UIView. Here, let's just assume it's already set up and is called
// (UIView *)mySubView
[actionSheet addSubview:myView];
// show the actionSheet
[actionSheet showInView:[UIApplication mainWindow]];
// Size the actionSheet with smooth animation
[UIView beginAnimations:nil context:nil];
[actionSheet setBounds:CGRectMake(0, 0, 320, 485)];
[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)
小智 9
对于那些想要找到DatePickerDoneClick函数的人来说......这里是解雇Action Sheet的简单代码.显然aac应该是一个ivar(你的implmentation .h文件中的那个)
- (void)DatePickerDoneClick:(id)sender{
[aac dismissWithClickedButtonIndex:0 animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么UIPickerView
要进去UIActionSheet
.这似乎是一个混乱和hacky解决方案,可以在未来的iOS版本中打破.(我以前在应用程序中有这样的东西,在UIPickerView
第一次点击时没有出现,并且不得不被重新制作 - 奇怪的怪癖UIActionSheet
).
我所做的只是实现一个UIPickerView
,然后将其作为子视图添加到我的视图中,并将其动画向上移动,就好像它像动作表一样呈现.
/// Add the PickerView as a private variable
@interface EMYourClassName ()
@property (nonatomic, strong) UIPickerView *picker;
@property (nonatomic, strong) UIButton *backgroundTapButton;
@end
///
/// This is your action which will present the picker view
///
- (IBAction)showPickerView:(id)sender {
// Uses the default UIPickerView frame.
self.picker = [[UIPickerView alloc] initWithFrame:CGRectZero];
// Place the Pickerview off the bottom of the screen, in the middle set the datasource delegate and indicator
_picker.center = CGPointMake([[UIScreen mainScreen] bounds].size.width / 2.0, [[UIScreen mainScreen] bounds].size.height + _picker.frame.size.height);
_picker.dataSource = self;
_picker.delegate = self;
_picker.showsSelectionIndicator = YES;
// Create the toolbar and place it at -44, so it rests "above" the pickerview.
// Borrowed from @Spark, thanks!
UIToolbar *pickerDateToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, -44, 320, 44)];
pickerDateToolbar.barStyle = UIBarStyleBlackTranslucent;
[pickerDateToolbar sizeToFit];
NSMutableArray *barItems = [[NSMutableArray alloc] init];
UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
[barItems addObject:flexSpace];
// The action can whatever you want, but it should dimiss the picker.
UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(backgroundTapped:)];
[barItems addObject:doneBtn];
[pickerDateToolbar setItems:barItems animated:YES];
[_picker addSubview:pickerDateToolbar];
// If you have a UITabBarController, you should add the picker as a subview of it
// so it appears to go over the tabbar, not under it. Otherwise you can add it to
// self.view
[self.tabBarController.view addSubview:_picker];
// Animate it moving up
[UIView animateWithDuration:.3 animations:^{
[_picker setCenter:CGPointMake(160, [[UIScreen mainScreen] bounds].size.height - 148)]; //148 seems to put it in place just right.
} completion:^(BOOL finished) {
// When done, place an invisible button on the view behind the picker, so if the
// user "taps to dismiss" the picker, it will go away. Good user experience!
self.backgroundTapButton = [UIButton buttonWithType:UIButtonTypeCustom];
_backgroundTapButton.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[_backgroundTapButton addTarget:self action:@selector(backgroundTapped:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_backgroundTapButton];
}];
}
// And lastly, the method to hide the picker. You should handle the picker changing
// in a method with UIControlEventValueChanged on the pickerview.
- (void)backgroundTapped:(id)sender {
[UIView animateWithDuration:.3 animations:^{
_picker.center = CGPointMake(160, [[UIScreen mainScreen] bounds].size.height + _picker.frame.size.height);
} completion:^(BOOL finished) {
[_picker removeFromSuperview];
self.picker = nil;
[self.backgroundTapButton removeFromSuperview];
self.backgroundTapButton = nil;
}];
}
Run Code Online (Sandbox Code Playgroud)
添加到marcio的真棒解决方案,dismissActionSheet:
可以实现如下.
将此方法添加到您的代码中.
- (void)dismissActionSheet:(id)sender{
[_actionSheet dismissWithClickedButtonIndex:0 animated:YES];
[_myButton setTitle:@"new title"]; //set to selected text if wanted
}
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
114381 次 |
最近记录: |