2014-08-29 1 views
1

Попытка сделать что-то довольно простое. Я создаю ряд прямоугольников, которые помещаются в горизонтальную прокрутку UIScrollView. Прямоугольники располагаются идеально. Однако каждый прямоугольник имеет на нем UILabel. Отображается только первая метка. Ни у кого из них нет. Красные прямоугольники здесь являются основными CGRect s. Желтый для меня, чтобы отладить, правильно ли рисуется метка. Как вы можете легко увидеть, отображается только первая метка:Невозможно заставить UILabels появляться на UIViews, созданных динамически

enter image description here

self.dayButtonsArray = [[NSMutableArray alloc] initWithCapacity:21]; 

CGFloat buttonSpacing = 2.0f; 
CGFloat buttonWidth = 50.0f; 
CGFloat buttonHeight = self.contentView.frame.size.height; 
CGFloat startX = self.contentView.frame.origin.x; 
CGFloat thisX = startX; 

for (int i=0; i<21; i++) { 

    CGRect frame = CGRectMake(thisX, self.contentView.frame.origin.y, buttonWidth, buttonHeight); 
    UIView *thisButton = [[UIView alloc] initWithFrame:frame]; 

    // set up a label for each view 
    UILabel *label = [[UILabel alloc] initWithFrame:frame]; 
    [label setTextColor:[UIColor blackColor]]; 
    label.font = [UIFont fontWithName:DEFAULT_FONT size:14]; 
    label.textAlignment = NSTextAlignmentCenter; 
    [label setText:[NSString stringWithFormat:@"DAY %d", i+1]]; 
    [labelsArray addObject:label]; 

    [thisButton setBackgroundColor:[UIColor redColor]]; 

    // now add these elements 
    [thisButton addSubview:label]; 
    [thisButton bringSubviewToFront:label]; 
    [self.contentView addSubview:thisButton]; 
    [self.contentView bringSubviewToFront:thisButton]; 
    [self.dayButtonsArray addObject:thisButton]; 

    CGRect contentSize = self.contentView.frame; 
    contentSize.size.width = ((i+1) * buttonWidth) + (i * buttonSpacing); 
    self.contentView.frame = contentSize; 

    thisX += buttonWidth + buttonSpacing; 
} 
+1

Я думаю, что вы можете установить 'contentSize.size.width' один раз - после цикла, а не устанавливать его на каждой итерации. – dasblinkenlight

+0

Согласовано, за исключением того, что значение int является локальным для цикла. Простое решение, в любом случае. – Alex

ответ

1

Вы используете один и тот же frame и для UIView и UILabel.

CGRect frame = CGRectMake(thisX, self.contentView.frame.origin.y, buttonWidth, buttonHeight); 
UIView *thisButton = [[UIView alloc] initWithFrame:frame]; 

// set up a label for each view 
UILabel *label = [[UILabel alloc] initWithFrame:frame]; <-- this frame should have an origin.x of 0.0 

рент- происхождение для label должно быть скорректировано с учетом из thisButton, так как вы добавляете его в качестве подвида.

+0

Хорошая идея. Я попробовал 'UILabel * label = [[UILabel alloc] initWithFrame: thisButton.frame];' но тот же результат. Если я сделаю ярлык подвид содержимого contentView, то он работает, но у меня также есть распознаватель жестов, который я боюсь, может не сработать. Очень странно. – Alex

+0

@ usr55410 Вы по-прежнему устанавливаете источник для UILabel с источником UIView. Используйте это: 'UILabel * label = [[UILabel alloc] initWithFrame: CGRectMake (0, 0, thisButton.frame.size.width, thisButton.frame.size.height)];' – Rick

0

x originUILabel не перемещается в петле. Таким образом, это означает, что вы создаете все ваши UILabel поверх друг друга

Попробуйте это:

float buttonWidth = 50.0f; 
float buttonHeight = 50.0f; 


for (int i = 0; i < 21; i++) 
{ 
    //note that the width is multiplying the i 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(buttonWidth*i, 20, buttonWidth, buttonHeight)]; 
    [label setText:[NSString stringWithFormat:@"DAY %d", i+1]]; 
    [label setTextColor:[UIColor blackColor]]; 
    [self.view addSubview:label]; 
} 
+0

Величина начала x перемещается в силу из кадра, который каждый раз пересматривается. Не то, чтобы я получил его на работу или что-то еще ... – Alex

Смежные вопросы