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

iOS 7 UIPickerView非选定行曲率修改多个组件,ios,ios7,uipickerview,Ios,Ios7,Uipickerview,我试图修改UIPickerView曲率,使其看起来像iOS 7计时器 以下是我所拥有的: 请注意,2和4是如何与选定行中的3发生显著偏移的。有没有办法让它更“平坦”,iOS7中的la计时器,其中2和4直接位于3的上方和下方 以下是我迄今为止所尝试的: 使用-(CGFloat)pickerView:(UIPickerView*)pickerView widthForComponent:(NSInteger)component玩游戏 在中使用自定义UIView和自定义UILabel偏移 似乎都不管

我试图修改UIPickerView曲率,使其看起来像iOS 7计时器

以下是我所拥有的:

请注意,2和4是如何与选定行中的3发生显著偏移的。有没有办法让它更“平坦”,iOS7中的la计时器,其中2和4直接位于3的上方和下方

以下是我迄今为止所尝试的:

  • 使用
    -(CGFloat)pickerView:(UIPickerView*)pickerView widthForComponent:(NSInteger)component玩游戏

  • 在中使用自定义UIView和自定义UILabel偏移

  • 似乎都不管用


    有什么帮助吗?

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


    我为解决这一问题而实施的一种方法是在屏幕上显示2个UIPickerViews,并相应地实现委托和数据源函数。

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

    我通过使用解决了布局问题

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

    该链接表示,当UIPickerView组件的大小大于106时,布局会中断。所以我把我的部分宽度定为106


    我在中间增加了空间,使UIPIKER有3个组成部分。

    偏移是由于选择器指示器所在的分离的凸起平面。这实际上是一个相当精确的真实透视图(嵌套的、打印的、清晰的圆柱体)的渲染。苹果在时钟应用程序中所做的是右对齐选择器标签。这样可以确保数字与其单位标签之间的间距保持不变。你也可以做同样的事情

    首先,在您的picker视图委托中,您希望实现-pickerView:attributedTitleForRow:forComponent:而不是-pickerView:titleForRow:forComponent:。(在给定白色文本颜色的情况下,看起来您已经这样做了。)您将使用NSParagraphStyle字符串属性。您需要在段落样式上设置两个属性:对齐和尾部缩进。对齐方式应设置为NSTextRightAlignment。尾部对齐将取决于您希望标签距组件右边缘的距离。如果有多个组件,则需要使用-pickerView:widthForComponent:设置组件的宽度。如果要将曲率保持在最小值,请将零部件宽度设置为尾部缩进的大约两倍

    注意:如果选择器正好有两个组件,则每个组件的宽度必须小于⅓ 选择器的宽度

    下面是一个代码示例:

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

    单元在独立组件中的放置非常优雅,但是如何防止单元上的滚动运动呢?苹果没有提供禁用拾取段反弹的界面,因为这与它的高性能相反。更重要的是,所有视图都应该有反弹,因为这样用户就知道这是路的尽头,没有任何东西会堆积起来。因此,如果没有一些技巧,我们无法禁用段反弹,或者您可以在带有单位的段上添加透明视图,并在其上禁用用户交互。其他解决方案可能是您已经尝试过的,在它们之外有2个选择器和单位,或者作为值的一部分。@Igor但苹果时钟中的单位不会反弹。我也在尝试禁用单位上的反弹。如果其他人仍在查看,则找到本文。此方法有效的原因是选择器标签是中心对齐的。将零部件设置为1时,这将确保零部件中心对齐,从而确保透视对齐。这不是时钟应用程序处理问题的方式。如果你仔细观察,你会发现苹果的标签是右对齐的。“请查看操作方法”。@Endersstocker,您的解决方案对我不起作用。你在iOS 7上验证过吗?这是一种在iOS 7上设计和使用的方法。我相信这也是苹果在时钟应用程序中使用的方法。很抱歉,您的NSTextAlignment解决方案不起作用。曲率仍然很明显。您验证了您的解决方案了吗?我忘了提到,对于使用多个组件的解决方案,组件宽度需要设置为尾部缩进值的大约两倍。我已经用细节更新了我的答案。另外,为了正确显示,对于一个选择器正好有两个组件的组件,有一个最大宽度。似乎是你的注释起了作用。将这两个组件的宽度设置为100是不同的。不需要段落样式或缩进。您是如何添加这些标签“ft”和“in”的?我正在寻找一种方法that@DCDC-标签只是使用UILabel覆盖在选择器顶部。