Ленивая оценка в R - это влияет на назначение?

Вот мой фрагмент рабочего кода:

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:attributeDict];

NSString *headline  = [dict objectForKey:@"title"];  
UIFont *font        = [UIFont boldSystemFontOfSize:18];  
CGRect  rect        = [headline boundingRectWithSize:CGSizeMake(300, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];

CGFloat height      = roundf(rect.size.height +4)

Я добавил 4px к вычисленной высоте, потому что без этих 4px отсутствует одна строка.

Я использую этот код snippet в таблицеView и добавьте «height» в массив NSNumbers, и я получу правильную высоту ячейки для textLabel по умолчанию.

Добавьте еще 4 пикселя, если вам нужно больше места под текстом в textLabel.

**** UPDATE ****

Я не согласен с «ошибкой ширины 40 пикселей», я кричу, что это 4 пикселя отсутствующей высоты, потому что 4px является значением по умолчанию высота пробела между буквой и границей одной строки. Вы можете проверить его с помощью UILabel, для шрифта 16 вам потребуется высота UILabel 20.

Но если ваша последняя строка не имеет «g» или что-то в ней, измерение может быть пропущено 4px от высоты.

Я перепроверил его с помощью небольшого метода, я получаю точную высоту 20,40 или 60 для моей метки и правую ширину менее 300 пикселей.

Для поддержки iOS6 и iOS7, вы можете использовать мой метод:

- (CGFloat)heightFromString:(NSString*)text withFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
    CGRect rect;

    float iosVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (iosVersion >= 7.0) {
        rect = [text boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
    }
    else {
        CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
        rect = CGRectMake(0, 0, size.width, size.height);
    }
    NSLog(@"%@: W: %.f, H: %.f", self, rect.size.width, rect.size.height);
    return rect.size.height;
}

**** UPGRADE ****

Благодаря вашим комментариям я обновил свою функцию. Поскольку sizeWithFont устарел, и вы получите предупреждение в XCode, я добавил диагностический прагма-код, чтобы удалить предупреждение для этой конкретной функции-вызова / блока кода.

- (CGFloat)heightFromStringWithFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
    CGRect rect;

    if ([self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
        rect = [self boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
    }
    else {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
        CGSize size = [self sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
        rect = CGRectMake(0, 0, size.width, size.height);
#pragma GCC diagnostic pop
    }
    return ceil(rect.size.height);
}

В дополнение к Тема 4px: в зависимости от того, какой шрифт и шрифт вы используете, вычисление возвращает разные значения высоты. В моем случае: HelveticaNeue-Medium с размером шрифта 16.0 возвращает высоту строки 20.0 для одной строки, но 39.0 для двух строк, 78px для 4 строк -> 1px отсутствует для каждой строки - начиная с строки 2 - но вы хотите чтобы ваше линейное пространство fontsize + 4px для каждой строки получило высоту-результат. Помните об этом во время кодирования! У меня еще нет функции для этой «проблемы», но я буду обновлять этот пост, когда закончу.

21
задан Community 23 May 2017 в 10:30
поделиться