IOS коснитесь UILabel в UITableView

#ios #uitableview #uiview

#iOS #uitableview #uiview

Вопрос:

Я пытаюсь создать представление, похожее на домашний просмотр Facebook, в котором есть несколько областей, к которым можно подключиться.

Все сделано (хотя я не знаю, следую ли я правильному пути для этого банкомата), но выравнивание вида неверное. Данные поступают в разные строки как введите описание изображения здесь. Чего я действительно хочу достичь, так это введите описание изображения здесь

Я отображаю свои данные в UITableView .

Я пробовал этот фрагмент кода:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{    
static NSString *CellIdentifier = @"Cell";

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
RequestInfo *requestInfo = [self.myDataArray objectAtIndex:indexPath.row];

NSArray *localizedStringPieces = [requestInfo.feed componentsSeparatedByString:@"#"];
NSUInteger msgChunkCount = localizedStringPieces ? localizedStringPieces.count : 0;

CGPoint wordLocation = CGPointMake(0.0, 0.0);
for (NSUInteger i = 0; i < msgChunkCount; i  )
{

    NSString *chunk = [localizedStringPieces objectAtIndex:i];

    if ([chunk isEqualToString:@""])
    {
        continue;
    }
    UILabel *label = [[UILabel alloc] init];
    label.font = [UIFont systemFontOfSize:16.0f];
    label.numberOfLines = 0;
    label.lineBreakMode = NSLineBreakByCharWrapping;

    label.preferredMaxLayoutWidth = cell.cellView.frame.size.width;
    CGSize maximumLabelSize = CGSizeMake(280, FLT_MAX);

    CGSize expectedLabelSize = [chunk sizeWithFont:label.font constrainedToSize:maximumLabelSize lineBreakMode:label.lineBreakMode];



    //adjust the label the the new height.
    CGRect newFrame = label.frame;
    newFrame.size.height = expectedLabelSize.height;
    label.frame = newFrame;
        if ([[identifireArray objectAtIndex:indexPath.row] count]> 0) {

        for (int i = 0; i < [[identifireArray objectAtIndex:indexPath.row] count]; i  ) {
            if ([chunk hasPrefix:[NSString stringWithFormat:@"(%@)",[[identifireArray objectAtIndex:indexPath.row] objectAtIndex:i]]]) {
                label.text = chunk;
                label.textColor = [UIColor colorWithRed:110/255.0f green:181/255.0f blue:229/255.0f alpha:1.0];
                label.highlightedTextColor = [UIColor yellowColor];
                label.userInteractionEnabled = YES;
                UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)];
                [label addGestureRecognizer:tapGesture];
                label.text = [label.text stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"(%@)",[[identifireArray objectAtIndex:indexPath.row] objectAtIndex:i]] withString:@""];


                break;
            } else {
                label.textColor = [UIColor blackColor];
                label.text = chunk;
                label.userInteractionEnabled = NO;
             }
        }
    }

    [label sizeToFit];

    if (cell.cellView.frame.size.width < wordLocation.x   label.bounds.size.width)
    {
        wordLocation.x = 0.0;                       // move this word all the way to the left...
        wordLocation.y  = label.frame.size.height;  // ...on the next line


        NSRange startingWhiteSpaceRange = [label.text rangeOfString:@"^\s*"
                                                            options:NSRegularExpressionSearch];
        if (startingWhiteSpaceRange.location == 0)
        {
            label.text = [label.text stringByReplacingCharactersInRange:startingWhiteSpaceRange
                                                             withString:@""];
            [label sizeToFit];
        }
    }

    // Set the location for this label:
    label.frame = CGRectMake(wordLocation.x,
                             wordLocation.y,
                             label.frame.size.width,
                             label.frame.size.height);



    [cell.cellView addSubview:label];

    // Update the horizontal position for the next word:
    wordLocation.x  = label.frame.size.width;



};


return cell;
  

}

Вот пример исходного текста, который я использую:

 #(team)Team_Football_Test# won the football match #(event)testing football# against #(team)Bengal Tigers Football Club(DG Testing)#
#(team)Team_crick_Test# won the football match #(event)C4 cricket# against #(team)Bengal Tigers Cricket Club(DG Testing)#
  

Когда я разделяю строку и добавляю ее в UILabel, я не могу выровнять ее должным образом. Я хочу, чтобы все выглядело так же, как страница Facebook на стене, где все данные правильно выровнены, но мой вид смещен. Как я могу это исправить?

Комментарии:

1. Добавьте скриншот того, что вы получаете и чего хотите

2. У вас также может возникнуть проблема с повторным использованием ячеек, поскольку вы постоянно добавляете дополнительные подвиды

3. Вот вывод . Но я хочу этот тип отображения .

4. @Wain Вот мой текущий вывод . Но я хочу этот тип вывода .

Ответ №1:

Не используйте несколько меток и не создавайте новые метки и не добавляйте в качестве вложенных представлений в tableView:cellForRowAtIndexPath: .

Итак, сначала создайте пользовательский подкласс cell, который добавит вашу метку и любые другие представления и разместит представления в нужных местах (и изменит их размер).

Для содержимого метки используйте attributedText вместо text и используйте информацию «фрагмент», чтобы применить атрибутивное форматирование к тексту в метке (вместо создания нескольких разных меток).

Ответ №2:

Я согласен с Wain.

Создайте пользовательскую ячейку и добавьте все свои метки, изображения и любое форматирование по умолчанию.

Конструктор пользовательского интерфейса для визуального создания всего этого. Это значительно упростит вашу жизнь.