当前位置:  开发笔记 > IOS > 正文

如何更改UIPickerView高度

如何解决《如何更改UIPickerView高度》经验,为你挑选了10个好方法。

是否可以更改UIPickerView的高度?某些应用程序似乎有较短的PickerViews,但设置较小的框架似乎不起作用,框架在Interface Builder中被锁定.



1> danielpunkas..:

很明显Apple没有特别邀请默认高度UIPickerView,但我发现你可以通过完全控制并在创建时传递所需的帧大小来实现视图高度的变化,例如:

smallerPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 120.0)];

你会发现,在不同的高度和宽度,有视觉故障.显然,这些故障要么需要以某种方式解决,要么选择另一种不显示它们的尺寸.


这对你有用吗?我实例化的所有UIPickerViews似乎被锁定到215的高度......
它确实有效,你只能将高度设置为低于162.
我被困在这一段时间了.重要的是要注意在首次出现之前必须使用帧或setframe初始化,否则会出现视觉故障.

2> bhavinb..:

上述方法都不适用于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,这样只有一部分拾取器可见,这是由我背景中的透明窗口决定的.


它仍然有效,你只能将它设置为低于162.

3> 小智..:

只有三个有效的高度UIPickerView (162.0, 180.0 and 216.0).

您可以使用CGAffineTransformMakeTranslationCGAffineTransformMakeScale功能将拾取器正确安装到您的方便.

例:

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)位置.


谢谢.这似乎是真的,但是有没有关于有效高度的Apple文档?

4> vijay adhika..:

尝试:

pickerview.transform = CGAffineTransformMakeScale(.5, 0.5);


我知道我在这里参加派对已经很晚了 - 也许现在有更好的方法可以做到这一点,但这对我有用.

5> mmorris..:

在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



6> rounak..:

从iOS 9开始,您可以自由更改UIPickerView宽度和高度.无需使用上述变换黑客.



7> 小智..:

我发现您可以编辑UIPickerView的大小 - 而不是使用界面构建器.使用文本编辑器打开.xib文件,并将选择器视图的大小设置为您想要的任何值.接口构建器不会重置大小,它似乎工作.我确定苹果锁定了尺寸是有原因的,所以你必须尝试不同的尺寸才能看到它有效.



8> HeikoG..:

好处:

    使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;
}



9> svarrall..:

更改选取器视图的可见高度的简单方法是将选取器嵌入到UIView中,将父视图的高度调整为要查看选取器的高度,然后在父UIView上的Interface Builder中启用"剪辑子视图"或view.clipsToBounds = true在代码中设置.

IB中的剪辑子视图



10> erran..:

我无法遵循上述任何建议.

我看过多个教程,发现这个教程最有益:

我添加了以下代码来设置"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;

希望这有用!

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有