UIPickerView - 为多行行使用自定义视图 - 需要布局建议

时间:2013-03-13 20:27:28

标签: ios user-interface uipickerview

我有一个UIPickerView,它会显示用户的项目列表。我希望每个项目都显示为多行文本,每行使用不同的字体大小。粗略的模型如下所示。这将允许显示比默认UIPickerView的单行更多的文本。

mockup

bdesham指出我要使用pickerView:viewForRow:forComponent:在UIPickerView的委托中重用View。这似乎是要走的路,因为它让我为各行提供自己的自定义视图。

我的想法是创建一个UIView,它有2个UILabel子视图,每个文本行一个。这样我可以为每一行应用不同的字体。我尝试了下面的内容,但布局似乎并没有起作用。我需要将线条放在另一个上面。以下是我试图通过面具将第二条线浮到底部。

#define VIEWTAG_LINE1 1
#define VIEWTAG_LINE2 2

- (UIView*)pickerView:(UIPickerView *)thePickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    UIView* v;
    if (view)
        v = view;
    else
    {
        v = [[[UIView alloc] init] autorelease];

        UILabel* l1 = [[[UILabel alloc] init] autorelease];
        l1.tag = VIEWTAG_LINE1;
        [v addSubview: l1];

        UILabel* l2 = [[[UILabel alloc] init] autorelease];
        l2.tag = VIEWTAG_LINE2;
        l2.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;
        [v addSubview: l2];
    }

    UILabel* l1 = (UILabel*)[v viewWithTag: VIEWTAG_LINE1];
    l1.text = [NSString stringWithFormat: @"row %d line 1", row];
    [l1 sizeToFit];

    UILabel* l2 = (UILabel*)[v viewWithTag: VIEWTAG_LINE2];
    l2.text = [NSString stringWithFormat: @"row %d line 2", row];
    [l2 sizeToFit];

    [v sizeToFit];

    return v;
}

这产生以下内容。有关获取两个UILabel视图的建议,以便它们相互叠加,产生所需的多行结果?

multi-line attempt

2 个答案:

答案 0 :(得分:3)

您需要设置两个标签的框架和字体。

    v = [[[UIView alloc] init] autorelease];

    UILabel* l1 = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 24)] autorelease];
    li.font = [UIFont sytemFontOfSize:22]; // choose desired size
    l1.tag = VIEWTAG_LINE1;
    [v addSubview: l1];

    UILabel* l2 = [[[UILabel alloc] initWithFrame:CGRectMake(0, 24, 320, 16)] autorelease];
    l2.font = [UIFont sytemFontOfSize:14]; // choose desired size
    l2.tag = VIEWTAG_LINE2;
    [v addSubview: l2];

根据需要调整标签的高度。根据需要调整y的{​​{1}}来源。

答案 1 :(得分:1)

如果有人在自动布局中遇到此问题,请将translatesAutoresizingMaskIntoConstraints设置为YES(这是默认值)。我将它设置为NO,这导致了所有问题。