是否可以更改UIPickerView的高度?某些应用程序似乎有较短的PickerViews,但设置较小的框架似乎不起作用,框架在Interface Builder中被锁定.
很明显Apple没有特别邀请默认高度UIPickerView
,但我发现你可以通过完全控制并在创建时传递所需的帧大小来实现视图高度的变化,例如:
smallerPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 120.0)];
你会发现,在不同的高度和宽度,有视觉故障.显然,这些故障要么需要以某种方式解决,要么选择另一种不显示它们的尺寸.
上述方法都不适用于iOS 4.0
pickerView的高度不再重新调整大小.如果您尝试在4.0中更改选择器的框架,则会有一条消息被转储到控制台:
-[UIPickerView setFrame:]: invalid height value 66.0 pinned to 162.0
我最终做了一些相当激进的事情,以获得一个适用于OS 3.xx和OS 4.0的较小选择器的效果.我把选择器留给了SDK决定它应该是什么尺寸,而是在我的背景图像上做了一个直通透明窗口,拾取器变得可见.然后简单地将拾取器放在后面(Z顺序)我的背景UIImageView,这样只有一部分拾取器可见,这是由我背景中的透明窗口决定的.
只有三个有效的高度UIPickerView (162.0, 180.0 and 216.0)
.
您可以使用CGAffineTransformMakeTranslation
和CGAffineTransformMakeScale
功能将拾取器正确安装到您的方便.
例:
CGAffineTransform t0 = CGAffineTransformMakeTranslation (0, pickerview.bounds.size.height/2); CGAffineTransform s0 = CGAffineTransformMakeScale (1.0, 0.5); CGAffineTransform t1 = CGAffineTransformMakeTranslation (0, -pickerview.bounds.size.height/2); pickerview.transform = CGAffineTransformConcat (t0, CGAffineTransformConcat(s0, t1));
上面的代码将拾取器视图的高度更改为一半,并将其重新定位到精确(Left-x1,Top-y1)位置.
尝试:
pickerview.transform = CGAffineTransformMakeScale(.5, 0.5);
在iOS 4.2和4.3中,以下工作:
UIDatePicker *datePicker = [[UIDatePicker alloc] init]; datePicker.frame = CGRectMake(0, 0, 320, 180); [self addSubview:datePicker];
以下不起作用:
UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 320, 180)]; [self addSubview:datePicker];
我有一个应用程序商店的应用程序与3行日期选择器.我认为可能已经阻止了高度变化,因为您在日期选择器的边框下看到了文本,但这也发生在正常的216高度日期选择器上.
哪个是bug?你的猜测和我的一样好.
UIDatePicker
(和UIPickerView
)162.0,180.0和216.0 也有3个有效高度.如果您将UIPickerView
高度设置为其他任何内容,则在iOS设备上进行调试时,您将在控制台中看到以下内容.
2011-09-14 10:06:56.180 DebugHarness[1717:707] -[UIPickerView setFrame:]: invalid height value 300.0 pinned to 216.0
从iOS 9开始,您可以自由更改UIPickerView
宽度和高度.无需使用上述变换黑客.
我发现您可以编辑UIPickerView的大小 - 而不是使用界面构建器.使用文本编辑器打开.xib文件,并将选择器视图的大小设置为您想要的任何值.接口构建器不会重置大小,它似乎工作.我确定苹果锁定了尺寸是有原因的,所以你必须尝试不同的尺寸才能看到它有效.
使setFrame UIPickerView
表现得像它应该的样子
你的内容中没有转换代码 UIViewController
适用于viewWillLayoutSubviews
重新缩放/定位UIPickerView
无需在iPad上运行 UIPopover
超类始终接收有效高度
适用于iOS 5
需要你子类 UIPickerView
需要使用pickerView viewForRow
撤消子视图的转换
UIAnimations可能不起作用
子类UIPickerView并使用以下代码覆盖这两个方法.它结合了子类化,固定高度和转换方法.
#define FIXED_PICKER_HEIGHT 216.0f - (void) setFrame:(CGRect)frame { CGFloat targetHeight = frame.size.height; CGFloat scaleFactor = targetHeight / FIXED_PICKER_HEIGHT; frame.size.height = FIXED_PICKER_HEIGHT;//fake normal conditions for super self.transform = CGAffineTransformIdentity;//fake normal conditions for super [super setFrame:frame]; frame.size.height = targetHeight; CGFloat dX=self.bounds.size.width/2, dY=self.bounds.size.height/2; self.transform = CGAffineTransformTranslate(CGAffineTransformScale(CGAffineTransformMakeTranslation(-dX, -dY), 1, scaleFactor), dX, dY); } - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { //Your code goes here CGFloat inverseScaleFactor = FIXED_PICKER_HEIGHT/self.frame.size.height; CGAffineTransform scale = CGAffineTransformMakeScale(1, inverseScaleFactor); view.transform = scale; return view; }
更改选取器视图的可见高度的简单方法是将选取器嵌入到UIView中,将父视图的高度调整为要查看选取器的高度,然后在父UIView上的Interface Builder中启用"剪辑子视图"或view.clipsToBounds = true
在代码中设置.
我无法遵循上述任何建议.
我看过多个教程,发现这个教程最有益:
我添加了以下代码来设置"viewDidLoad"方法中的新高度,该方法适用于我的应用程序.
UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 120.0)]; [self.view addSubview:picker]; picker.delegate = self; picker.dataSource = self;
希望这有用!