UIPickerView - 移除曲率并添加文本
Posted
技术标签:
【中文标题】UIPickerView - 移除曲率并添加文本【英文标题】:UIPickerView - remove curvature and add text 【发布时间】:2014-09-05 18:01:54 【问题描述】:我正在尝试创建一个 UIPicker,我可以在其中选择分钟和秒。代码如下:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
return 2;
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
if(component == 0)
return 24;
return 60;
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
return 30;
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setAlignment:NSTextAlignmentCenter];
[paragraphStyle setTailIndent:20];
NSString *value = [NSString stringWithFormat:@"%d", row];
return [[NSAttributedString alloc] initWithString:value
attributes:@NSParagraphStyleAttributeName:paragraphStyle];
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
return 160;
我怎样才能摆脱烦人的曲率,只做垂直的列?
另外,如何在选择行中添加“min”和“sec”?
【问题讨论】:
您可以使用 UIDatePicker 并消除自己编码的麻烦。 AFAIK 你不能用 UIDatePicker 做分秒。 如果你不想要曲率,我认为你必须创建自己的。只使用 2 个窄表视图应该很容易。您只需在滚动视图委托方法中添加代码,即可在滚动停止时自动选择该值。 【参考方案1】:我发现更改组件的宽度会影响 UIPickerView 应用于所选行的偏移量或曲率效果。在您的委托中实现 pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat
并尝试返回足够大以显示您想要显示的信息的值,例如 40 或 60 用于简单数字的两个文本字符。要更改列/组件之间的间距,您可以添加额外的组件,返回 0 的行数,并使用这些空组件的宽度来移动和调整您正在显示数据的组件的位置。
【讨论】:
【参考方案2】:既然你把它变成了 24 分 60 秒,我会用 24 小时日期选择器来伪造它。海事组织
我怎样才能摆脱烦人的曲率,只做垂直的柱子?
你没有。否则,使用 2 个表视图或其他东西实现您自己的。
另外,如何在选择行中添加“min”和“sec”?
NSString *value;
if(component == 0) value = [NSString stringWithFormat:@"%d min", row];
else value = [NSString stringWithFormat:@"%d sec", row];
【讨论】:
此代码将“min”和“sec”添加到所有行。我只希望中间的“选定”行显示“分钟”和“秒”文本。 至于用 24 小时日期选择器伪造它,这似乎是不可能的,因为我需要显示分钟和秒,而不是小时和分钟。 24 小时日期选择器仅显示数字(检查闹钟应用程序,确保将设备设置为 24 小时)。如果您想要一个 min 和 sec,请将其设为 4 个组件到选取器,并分别为组件 1 和 3 返回“min”和“sec”,并为它们返回 1 行。【参考方案3】:正如其他人所说,现有的 API 做不到。如果你想这样做,你必须编写自己的代码来做到这一点。我过去创建了一个水平值选择器,这很烦人,但相当直接。为此,我使用了UILabel
、图像和UIScrollView
。
首先设置用户界面
-
获取标签并将其粘贴在滚动视图中。使用您想要的值填充标签。
设置滚动视图的高度、宽度和位置以显示您希望用户看到的内容。如果您希望用户看到所选项目以及顶部的 3 和底部的 3,请使其大到足以在标签中显示 7 行。
您的图像是“选择指示器”,您将其覆盖在滚动视图的中心项目之上,以向用户显示这是所选项目。
如果您想要一个漂亮的淡入淡出效果,因为您的值消失了,您可以创建一个白色(或您的应用程序的任何背景)块,该块淡入透明并将其覆盖在滚动视图的顶部和底部。这会在组件的边缘产生淡入淡出的数字效果。
在视觉上它显示了工作......大部分情况下,但我们需要后端代码来支持它。
-
创建一个
UIScrollViewDelegate
并实现scrollViewDidScroll:
,它会在用户更改滚动视图时告诉您滚动视图的内容偏移量。
编写一个方法,将滚动视图内容偏移量转换为选择“项目”的位置。如果您知道标签中有多少行(并且您应该)并且您知道标签的高度(并且您应该)获取标签高度/行来获取每个“项目”的高度。然后你取内容偏移量,除以项目高度,将它放在地板上,你知道你在哪一行......同时记住内容偏移量是从滚动视图的顶部开始的,所以加上一半的高度。 :)
所以基本功能已经完成并且可以工作,但它并不漂亮。
所选项目没有在我的选择图像中居中结束,这在视觉上很难看。但是你可以很容易地修复它。您知道列表中项目的高度,并且知道选择了哪个项目,因此以编程方式滚动滚轮以使该项目居中。
我遇到的另一个问题是动力。就像一个真正的***一样,我希望我的选择器有动力,所以如果你用力轻弹它会走一段时间,但如果你轻弹它会很快停止。我有很长的清单,如果人们从 7 岁到 70 岁,我希望他们能够轻松地做到这一点。如果您对此感兴趣,我可以向您展示我是如何做到的,并在我带着我的代码回到机器时发布一些代码。
【讨论】:
你有一些代码可以分享一下吗,会很有帮助的。以上是关于UIPickerView - 移除曲率并添加文本的主要内容,如果未能解决你的问题,请参考以下文章
UITextField inputview 弹出 UIPickerView 在pickerview中显示问号