#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.
Создайте пользовательскую ячейку и добавьте все свои метки, изображения и любое форматирование по умолчанию.
Конструктор пользовательского интерфейса для визуального создания всего этого. Это значительно упростит вашу жизнь.