如何在 UIpickerview 的整个生命周期内动态更改其行高?

Posted

技术标签:

【中文标题】如何在 UIpickerview 的整个生命周期内动态更改其行高?【英文标题】:How do I dynamically change the row height of a UIpickerview throughout its lifetime? 【发布时间】:2012-11-28 17:20:41 【问题描述】:

只是为了澄清,我不是在问如何在设置 UIpickerview 时一开始就设置行高。我知道您为此目的使用了 pickerView:rowHeightForComponent。

但是,我要问的是是否希望 pickerView:rowHeightForComponent 返回一个变量值,该值可以在 UIpickerview 的生命周期内更改,例如,响应单击按钮或更改默认设置.

我发现,不幸的是,pickerView:rowHeightForComponent 只被调用一次,在开始时,当 ios 设置 UIpickerview 时。之后,它再也不会调用pickerView:rowHeightForComponent,因此无法获取pickerView:rowHeightForComponent 再次调用时返回的值的变化。

我想我可以只释放 UIpickerview 并设置另一个,迫使 iOS 再次调用 pickerView:rowHeightForComponent,但这可能不方便,并且可能需要保存状态信息。还有另一种更简单的方法来动态更改行高吗?谢谢!

四处搜索,我找到了Changing UIPickerView row height(这只是第一次设置行高)和How to change the size of row in UIPickerView by button click?,它谈到了rowSizeForComponent方法,它似乎只是使用缓存的行高值。

这是尝试更改行高的代码部分,以及测试 reloadAllComponents: 正如@RileyE 所建议的那样

NSLog(@"before, scrollviewSpacing is %d", self.mainViewController.IACscrollviewSpacing);
if (0.0 != fromDefaultsScrollviewSpacing) 
    self.mainViewController.IACscrollviewSpacing = (UInt8) round (60.0 - fromDefaultsScrollviewSpacing);

NSLog(@"now scrollviewSpacing is %d", self.mainViewController.IACscrollviewSpacing);
NSLog(@"rowsizeforcomponent height is %f", [self.mainViewController.PickIPAddress rowSizeForComponent:1].height);
[self.mainViewController.PickIPAddress reloadAllComponents];
NSLog(@"rowsizeforcomponent height is %f", [self.mainViewController.PickIPAddress rowSizeForComponent:1].height);
[self.mainViewController.PickIPAddress reloadComponent:1];
NSLog(@"rowsizeforcomponent height is %f", [self.mainViewController.PickIPAddress rowSizeForComponent:1].height);

在控制台上给出以下输出:

2012-11-29 02:32:14.681 IP 地址计算器[6404:c07] 之前,scrollviewSpacing 为 39 2012-11-29 02:32:18.913 IP 地址计算器 [6404:c07] 现在滚动视图间距为 22 2012-11-29 02:32:20.196 IP 地址计算器 [6404:c07] 组件高度为 39.000000 2012-11-29 02:32:28.865 IP 地址计算器 [6404:c07] 组件高度为 39.000000 2012-11-29 02:32:30.903 IP 地址计算器 [6404:c07] rowsizeforcomponent 高度为 39.000000

在 MainViewController(即 UIpickerviewdelegate)中,我有

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component 
return self.IACscrollviewSpacing; 

此外,我在这里设置了一个断点,我发现它仅在最初设置 UIPickerview 时才被调用,以后再也不会调用。

【问题讨论】:

你是说如果你在选择器视图上调用reloadComponent: 会再次调用rowHeightForComponent: 吗? 我是说 reloadAllComponents: 不会再次调用 rowHeightForComponent: ,这对我来说是个问题。如果是这样,那么它将获取我想用于行高的新值。 对不起,我有一个错字。我的意思是“没有被调用”,而不是“被调用”。你现在已经确认了。这是出乎意料的。 【参考方案1】:

当你调用[yourPicker reloadAllComponents];时,所有的委托方法都会被再次调用和更新

查看UIPickerView 和UIPickerViewDelegate 文档。尤其要查看“重新加载视图选择器”部分。

【讨论】:

再次阅读问题。这与表格视图无关。 谢谢,但它是 UIpickerview,而不是 UItableview。没有 reloadData 方法。有 reloadAllComponents 或 reloadComponent: 但这些只是再次读取数据(UIpickerviewdatasource 协议方法),并且不调用 UIpickerviewDelegate 协议方法(至少,不是 pickerView:rowHeightForComponent)。 @rmaddy 啊。然而,我的错是同样的事情。我已经更新了我的答案。 我知道这对我有用。如果更改行高对您不起作用,那么您所调用的内容有问题。 @RileyE 我刚刚做了自己的测试,当我在选择器视图上调用reloadAllComponentsreloadComponent: 时,除了pickerView:rowHeightForComponent: 之外,所有适当的委托/数据源方法都会被调用方法。我在 iOS 6 下测试。你确定在选择器完全显示并稍后重新加载后为你调用了rowHeightForComponent:【参考方案2】:

我不确定UIPickerView 是否可以动态更改行高。

但我确实实现了一个选择器视图名称DLPickerView。您可以为不同的行返回不同的高度。理论上它还可以在整个生命周期内改变行高

【讨论】:

以上是关于如何在 UIpickerview 的整个生命周期内动态更改其行高?的主要内容,如果未能解决你的问题,请参考以下文章

php生命周期的详解

Flutter-如何在flutter的整个应用程序生命周期中将数据保存在内存中?

VUE--生命周期

C语言中,哪种存储类的作用域与生命周期是不一致的?

如何在 Android 的生命周期感知协程范围内返回函数值?

如何创建仅在 JVM 生命周期内存在的 HSQLDB 数据库?