我正在寻找一个函数或循环原型来将UILabel添加到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++;
}
答案 0 :(得分: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++;
}
现在新标签的框架保存在临时var(CGRect框架)中,您可以使用它。
答案 1 :(得分:0)
此代码应该有效:
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*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++;
}
答案 2 :(得分: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:
标签以引用每个标签,或者从数组中收集,而不是循环遍历子视图以在创建文本后收集或附加文本。
答案 3 :(得分: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];
}
这应该意味着你不需要柜台。
希望这有帮助!
马特