iOS 7 UIPickerView非选择行曲率修改多个组件

时间:2013-11-07 00:24:30

标签: ios ios7 uipickerview

我正在尝试将UIPickerView曲率修改为iOS 7 Timer。

以下是我所拥有的: enter image description here

注意2和4如何与所选行中的3显着偏移。有没有办法让它更“扁平”,在iOS7中是一个定时器,其中2和4直接位于3的上方和下方?

这是我到目前为止所尝试的内容:

  1. 使用- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component

  2. 中使用自定义UIView和自定义UILabel偏移量

    似乎无效。

    任何帮助?

4 个答案:

答案 0 :(得分:7)

偏移是由选择器指示器所在的单独的凸起平面引起的。这实际上是对这种现实生活视角(嵌套,印刷,透明圆柱体)的相当准确的渲染。 Apple在Clock应用程序中的作用是右对齐拾取器标签。这确保了数字与其单位标签之间的间距保持不变。你可以做同样的事情。

首先,在你的选择器视图委托中你要实现 -pickerView:attributionTitleForRow:forComponent:来代替 -pickerView:titleForRow:forComponent:。 (看起来你已经用白色文本颜色完成了这个。)你将使用 NSParagraphStyle 字符串属性。您需要在段落样式上设置两个属性:alignment和tail indent。对齐应设置为 NSTextRightAlignment 。尾部对齐将取决于您希望标签从组件的右边缘坐多远。如果您有多个组件,则需要使用 -pickerView:widthForComponent:设置组件的宽度。如果要将曲率保持在最小值,请将组件宽度设置为尾部缩进的大约两倍。

注意:如果您的选择器只有两个组件,则每个组件的宽度必须小于选择器宽度的1/3。

这是一个代码示例:

- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setAlignment:NSTextAlignmentRight];
    [paragraphStyle setTailIndent:150];

    return [[NSAttributedString alloc] initWithString:@"42"
                                           attributes:@{NSParagraphStyleAttributeName:paragraphStyle}];
}

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
    return 300;
}

答案 1 :(得分:1)

而是2个组件,尝试制作4个组件,类似于此片段:

- (void)viewDidLoad
{
    [super viewDidLoad];
     self.model  = @[@"1",@"2",@"3",@"4",@"5",@"6"];
}


- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 4;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    NSInteger numberOfRows;
    if(component == 0 || component == 2)
    {
        numberOfRows = [self.model count];
    }
    else
    {
        numberOfRows = 1;
    }
    return numberOfRows;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    NSString* title;
    switch (component) {
        case 0:
        case 2:
            title = self.model[row];
            break;
        case 1:
            title = @"ft";
            break;
        case 3:
            title = @"in";
            break;
        default:
            break;
    }
    return title;
}

答案 2 :(得分:1)

我使用

修复了布局问题
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{
    switch (component){
        case 0:
            return 106.0f;
        case 1:
            return 50.0f;
        case 2:
            return 106.0f;
    }
    return 0;
}

https://stackoverflow.com/a/19743682/809671

当UIPickerView组件的大小超过106时,链接显示布局中断。所以我将节宽度设为106.

我通过让UIPicker有3个组件来添加中间的空间。

答案 3 :(得分:0)

我注意到如果组件数== 1,则没有这种缩放+偏移效果。

我实现修复此问题的方法是在屏幕上显示2个UIPickerViews并相应地实现委托和数据源函数。