UILabel имеет странную серую верхнюю строку / границу в iOS7, как ее можно удалить?

17

У меня есть базовый UILabel, который я использую в UITableViewCell . Я испытываю какое-то странное поведение, в некоторых ячейках (не все) UILabel получает серое верхнее поле, см. Рисунок ниже. И я не знаю, как это исправить.

Я создаю свой UILabel следующим образом:

if (self.postText == nil) {
    CGRect postTextRect = CGRectMake(self.profileImage.frame.origin.x + self.profileImage.frame.size.width + 5, self.username.frame.origin.y + self.username.frame.size.height, frame.size.width - self.profileImage.frame.size.width - self.profileImage.frame.origin.y -10, self.frame.size.height - self.username.frame.size.height - self.username.frame.origin.y + 40);
    self.postText = [[UILabel alloc] initWithFrame:postTextRect];
    self.postText.backgroundColor = [UIColor whiteColor];
    self.postText.textColor = [UIColor darkGrayColor];
    self.postText.userInteractionEnabled = NO;
    self.postText.numberOfLines = 0;
    [self.containerView addSubview:self.postText];
}

Любые идеи о том, как исправить это?

Обновить

My cellForRowAtIndexPath выглядит следующим образом:

- (id)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    [...]
    static NSString *postCellIdentifier = @"PostCell";
    PostCell *cell = [tableView dequeueReusableCellWithIdentifier:postCellIdentifier];
    if (cell == nil) {
        cell = [[PostCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:postCellIdentifier];
    }

    [self configureCell:cell atIndexPath:indexPath forPost:cellPost];
    return cell;
}

И соответствующий параметр configureCell выглядит следующим образом:

- (void)configureCell:(PostCell *)cell atIndexPath:(NSIndexPath *)indexPath forPost:(Post *)post
{
    [...]

    cell.username.text = cellUser.username;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    CGSize maximumLabelSize = CGSizeMake(cell.postText.frame.size.width, FLT_MAX);
    CGSize expectedLabelSize = [cell.postText.text sizeWithFont:cell.postText.font constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByWordWrapping];
    CGRect newFrame = cell.postText.frame;
    newFrame.size.height = expectedLabelSize.height;
    cell.postText.frame = newFrame;

    CGRect containerRect = CGRectMake(5, 5, cell.containerView.frame.size.width, cell.postText.frame.size.height + cell.username.frame.origin.y + cell.username.frame.size.height + 10);
    if (containerRect.size.height < 65) {
        containerRect.size.height = 65;
    }

    cell.containerView.frame = containerRect;
    [...] 
}
    
задан Anders 11.01.2014 в 19:06
источник
  • Вы пытались установить цвет BG для очистки? –  Aleksander Azizi 11.01.2014 в 19:13
  • @AleksanderAzizi, да, и это не помогло. –  Anders 11.01.2014 в 19:14
  • вы пытались удалить разделитель uitableviewcell? –  Ilario 11.01.2014 в 19:17
  • @Ilario Да, тоже не помогло. –  Anders 11.01.2014 в 19:36
  • почему бы вам не установить backgroundColor UILabel на clearColor, и его фактический контроль может быть белым ... –  holex 15.04.2014 в 15:05
Показать остальные комментарии

9 ответов

34

У меня была такая же проблема и она была решена путем округления высоты:

newFrame.size.height = ceilf(expectedLabelSize.height);
    
ответ дан Blago 15.04.2014 в 14:00
  • Это должен быть принят ответ –  mkll 09.11.2015 в 19:18
  • Для Swift: ceil (ожидаетсяLabelSize.height) –  Phil Andrews 16.02.2016 в 00:01
  • Ну, я люблю тебя. –  user1105951 01.04.2016 в 13:31
  • Вы также можете использовать cell.containerView.frame = CGRectIntegral (containerRect). –  Iulian Onofrei 06.02.2017 в 12:36
4

Вышла та же проблема

Решено, назначив цвет и ширину границы для UILabel

nameLabel.layer.borderColor = [[UIColor whiteColor]CGColor]; nameLabel.layer.borderWidth = 2.0f;     

ответ дан Konda 27.02.2014 в 13:32
4

Это должна быть ошибка iOS. Ошибка инициируется значением высоты поплавка метки. Таким образом, простой и не побочный эффект для решения этой проблемы - преобразование значения высоты поплавка в значение int:

(int)(label.frame.size.height)
    
ответ дан Allen 06.03.2015 в 08:46
1

попробуйте следующее:

        cell.postText.layer.borderColor = self.Detail.backgroundColor.CGColor;
        cell.postText.layer.borderWidth = 1;
    
ответ дан user3016927 25.09.2014 в 11:22
1

Странные серые контуры обусловлены тем, что размер фона и размер метки не являются точными.

Это можно решить отлично:

[myLabel sizeToFit]
    
ответ дан shumin 02.11.2016 в 07:41
0

Вместо этого решил использовать UITextView .

Проблема возникает при изменении кадра UILabel.

Измените этот код:

CGSize maximumLabelSize = CGSizeMake(cell.postText.frame.size.width, FLT_MAX);
CGSize expectedLabelSize = [cell.postText.text sizeWithFont:cell.postText.font constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByWordWrapping];
CGRect newFrame = cell.postText.frame;
newFrame.size.height = expectedLabelSize.height;
cell.postText.frame = newFrame;

, чтобы ...

[cell.postText sizeToFit];

Удалил границу. Но контент не отображался так, как я этого хотел, поэтому я перешел на UITextView

    
ответ дан Anders 11.01.2014 в 22:20
0

Настоящая причина заключается в том, что высота или ширина рамки не являются целыми или изменяют цвет фона вашего приложения, чтобы очистить цвет.

把 рама 的 ширина 或者 высота 修改 为 整数, 或者 设置 背景 色 为 прозрачный цвет 即可.

    
ответ дан Leonardo zhang 15.08.2014 в 06:51
0

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

Это решение работает для меня, устанавливая backgroundColor метки на Clear.

Objective-C:

[label setBackgroundColor:[UIColor clearColor]];

скор:

label.setBackgroundColor = UIColor.clearColor()
    
ответ дан Mara Jimenez 24.02.2016 в 08:04
0

У меня была такая же проблема. просто сделав labelView.layer.opaque = false; фиксированной шахты. надеюсь, что это будет полезно кому-то.

    
ответ дан user2160335 23.02.2018 в 10:07