1

我正在寻找一个函数或循环原型来将 UILabels 添加到 iPhone 上的视图中。这样做的原因是我不会提前知道我需要添加多少标签,因此需要动态添加它们。

我的伪代码如下。这个想法是给每个标签一个字符串,然后放置在下一个屏幕中,因此 +self.view.frame.size.width 语句。分页等工作完美,问题是所有标签似乎都在第二个屏幕上结束,即标签 3 出现在标签 2 的顶部。问题似乎是我总是引用 altLabel,因此一旦我移动到第二个位置,我一直在参考那个位置,并且从不移动一次。

我可以使用 'count' 变量来倍增屏幕宽度,但如果我这样做,每次我更新标签文本时,它都会覆盖以前的。

int count = 0;
int maxNumber = 10;

    while(count < maxNumber) {
    //Add a label
        UILabel *altlabel; //Declare the label

        if (count > 0) {
            //Move the label
             altlabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMinX(altlabel.frame)+self.view.frame.size.width,10,300,25)];
            altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class+count];
        }

        else {
             altlabel = [[UILabel alloc] initWithFrame:CGRectMake(10,10,300,25)];
            altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class];
        }


    altlabel.textColor = [UIColor greenColor];
    [altlabel sizeToFit];
    [_scrollView addSubview:altlabel];
        count++;
    }
4

4 回答 4

1

问题是这一行:

UILabel *altlabel; // Declare the label

if (count > 0) {
    //Move the label
    altlabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMinX(altlabel.frame)+self.view.frame.size.width,10,300,25)];
    altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class+count];
}

您正在使用altlabel.frame设置框架,但没有设置altlabel:您在第一行使用UILabel *altlabel重新声明了它。

使用此代码,除第一个标签外的每个标签都将具有相同的框架。试试这个:

int count = 0;
int maxNumber = 10;

CGRect rect;

while(count < maxNumber) {
    // Add a label
    UILabel *altlabel; // Declare the label

    if (count > 0) {
        //Move the label
        altlabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMinX(rect.frame)+self.view.frame.size.width*count, 10, 300, 25)];
        altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class+count];

    } else {
        altlabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 300, 25)];
        altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class];
    }

    rect = altlabel.frame;

    altlabel.textColor = [UIColor greenColor];
    [altlabel sizeToFit];
    [_scrollView addSubview:altlabel];
    count++;
}

现在新标签的框架保存在一个临时变量(CGRect 框架)中,您可以使用它。

于 2013-10-07T08:36:18.250 回答
0

此代码应该可以工作:

整数计数 = 0;int maxNumber = 10;

while(count < maxNumber) {
//Add a label
    UILabel *altlabel; //Declare the label

    if (count > 0) {
        //Move the label
         altlabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMinX(altlabel.frame)+(self.view.frame.size.width*count),10,300,25)];
        altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class+count];
    }

    else {

         altlabel = [[UILabel alloc] initWithFrame:CGRectMake(10,10,300,25)];
        altlabel.text = [NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class];
    }


altlabel.textColor = [UIColor greenColor];
[altlabel sizeToFit];
[_scrollView addSubview:altlabel];
    count++;
}
于 2013-10-07T08:35:21.090 回答
0

我认为问题在于每次循环运行时都会重新初始化您的标签“altLabel”,因此标签的框架也会被重置。

这意味着每次创建新标签时,框架都将位于完全相同的位置。解决此问题的一种简单方法是将标签的初始声明移到 while 循环之外。

一个潜在的更好和更有效的修复将需要对所使用的循环进行返工。当我做这样的事情时,我倾向于使用 for 循环,因为您使用索引来帮助定位事物:

for(int i = 0; i < 10; i++)
{
  //Getting the x-position correct here may take a little trial and error
  UILabel *altLabel = [[UILabel alloc] initWithFrame:CGRectMake(INSET + i*LABEL_WIDTH, 10, 300, 25)];
  [altLabel setText:[NSString stringWithFormat:@"%@ %@ (%d)", _name,_age, class+count]];
  [altLabel setTextColor:[UIColor greenColor]];
  [altLabel sizeToFit];
  [_scrollView addSubview:altLabel];
}

这应该意味着您不需要计数器。

希望这会有所帮助!

马特

于 2013-10-07T08:38:24.020 回答
0

一种更简洁的方法是在创建之前预先确定标签的框架,然后将其添加为子视图(或者可能将每个标签保存到数组中以供以后参考)。

NSInteger numberOfLabels = 10;
CGFloat labelHeight = 25.0;
CGFloat padding = 10.0;

for(NSInteger index = 0; index < numberOfLabels; ++index)
{
    CGRect frame = CGRectMake(10.0, (index * (labelHeight + padding)), 300.0, labelHeight);

    UILabel *label = [[UILabel alloc] initWithFrame:frame];

    [[self view] addSubview:label];
}

您可能希望为标签分配一个标签setTag:以引用每个标签,或者从数组中收集而不是循环通过子视图在创建后收集或附加文本。

于 2013-10-07T08:37:26.927 回答