2

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

小样

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

我的想法是创建一个 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 视图以便将它们堆叠在一起产生所需的多行结果的任何建议?

多线尝试

4

2 回答 2

4

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

    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原点。l2

于 2013-03-14T03:04:49.217 回答
1

如果有人在使用自动布局时遇到此问题,请设置translatesAutoresizingMaskIntoConstraintsYES(这是默认值)。我将其设置为NO,这导致了所有问题。

于 2015-05-21T11:59:42.097 回答