1

我正在尝试创建一个 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”?

拣货员

4

3 回答 3

1

我发现更改组件的宽度会影响 UIPickerView 应用于所选行的偏移量或曲率效果。在您的委托实现pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat中,并尝试返回足够大的值以显示您要显示的信息,例如 40 或 60 用于简单数字的两个文本字符。要更改列/组件之间的间距,您可以添加额外的组件,返回 0 的行数,并使用这些空组件的宽度来移动和调整您正在显示数据的组件的位置。

于 2018-03-28T14:04:20.540 回答
0

既然你把它变成了 24 分 60 秒,我会用 24 小时日期选择器来伪造它。国际海事组织

我怎样才能摆脱烦人的曲率,只做垂直的柱子?

你没有。否则,使用 2 个表视图或其他东西实现自己的。

另外,如何在选择行中添加“min”和“sec”?

NSString *value;

if(component == 0) value = [NSString stringWithFormat:@"%d min", row];
else  value = [NSString stringWithFormat:@"%d sec", row];
于 2014-09-05T18:44:13.217 回答
0

正如其他人所说,现有的 API 做不到。如果你想这样做,你必须编写自己的代码来做到这一点。我过去创建了一个水平值选择器,这很烦人,但相当直接。为此,我使用了一个UILabel、一个图像和一个UIScrollView.

首先设置用户界面

  1. 获取标签并将其粘贴在滚动视图中。使用您想要的值填充标签。
  2. 设置滚动视图的高度、宽度和位置以显示您希望用户看到的内容。如果您希望用户看到所选项目和顶部的 3 和底部的 3,则使其大到足以在标签中显示 7 行。
  3. 您的图像是“选择指示器”,您将其覆盖在滚动视图的中心项目之上,以向用户显示这是所选项目。
  4. 如果你想要一个漂亮的淡入淡出效果,因为你的值消失了,你可以创建一个白色(或你的应用程序的任何背景)块,它淡入透明并将其覆盖在滚动视图的顶部和底部。这会在组件的边缘创建一个淡入淡出的数字效果。

视觉上它显示了工作......在大多数情况下,但我们需要后端代码来支持它。

  1. 创建一个UIScrollViewDelegate并实现scrollViewDidScroll:,它会在用户更改滚动视图时告诉您滚动视图的内容偏移量。
  2. 编写一个方法,将滚动视图内容偏移量转换为选择“项目”的位置。如果您知道标签中有多少行(并且您应该)并且您知道标签的高度(并且您应该)获取标签高度/行以获取每个“项目”的高度。然后你取内容偏移量,除以项目高度,将它放在地板上,你知道你在哪一行......同时记住内容偏移量是从滚动视图的顶部开始的,所以加上一半的高度。:)

所以基本功能已经完成并且可以工作,但它并不漂亮。

所选项目没有以我的选择图像为中心结束,这在视觉上很难看。但是你可以很容易地修复它。您知道列表中项目的高度,并且知道选择了哪个项目,因此以编程方式滚动滚轮以使该项目居中。

我遇到的另一个问题是动力。就像一个真正的轮子一样,我希望我的选择器有动力,所以如果你用力轻弹它会走一会儿,但如果你轻弹它会很快停止。我有很长的清单,如果人们从 7 岁到 70 岁,我希望他们能够轻松地做到这一点。如果您对此感兴趣,我可以向您展示我是如何做到的,并在我带着我的代码回到机器时发布一些代码。

于 2014-09-05T19:25:35.537 回答