Подтвердить что ты не робот

Как использовать drawInRect: withAttributes: вместо drawAtPoint: forWidth: withFont: fontSize: lineBreakMode: baselineAdjustment: в iOS 7

Этот метод устарел в iOS 7.0:

drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:

Теперь используйте drawInRect:withAttributes:.

Я не могу найти имя атрибута fontSize и базовую настройку.

Изменить

Спасибо @Puneet ответ.

На самом деле, я имею в виду, если у них нет этого ключа, как реализовать этот метод в iOS 7?

Как ниже метод:

+ (CGSize)drawWithString:(NSString *)string atPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font fontSize:(CGFloat)fontSize
           lineBreakMode:(IBLLineBreakMode)lineBreakMode
      baselineAdjustment:(UIBaselineAdjustment)baselineAdjustment {
    if (iOS7) {
        CGRect rect = CGRectMake(point.x, point.y, width, CGFLOAT_MAX);

        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.lineBreakMode = lineBreakMode;

        NSDictionary *attributes = @{NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle};

        [string drawInRect:rect withAttributes:attributes];

        size = CGSizeZero;
    }
    else {
        size = [string drawAtPoint:point forWidth:width withFont:font fontSize:fontSize lineBreakMode:lineBreakMode baselineAdjustment:baselineAdjustment];
    }
    return size;
}

Я не знаю, как передать fontSize и baselineAdjustment в

attributes словарь.

например.

Клавиша

NSBaselineOffsetAttributeName должна передать ему NSNumer, а baselineAdjustment - Enum.

Нет ли другого способа передать две переменные?

4b9b3361

Ответ 1

Вы можете использовать NSDictionary и применять такие атрибуты:

NSFont *font = [NSFont fontWithName:@"Palatino-Roman" size:14.0];

NSDictionary *attrsDictionary =

[NSDictionary dictionaryWithObjectsAndKeys:
                              font, NSFontAttributeName,
                              [NSNumber numberWithFloat:1.0], NSBaselineOffsetAttributeName, nil];

Используйте attrsDictionary в качестве аргумента.

Обратитесь: Руководство по программированию с атрибутами строкой

Обратитесь: Стандартные атрибуты

SWIFT: IN String drawInRect недоступен, но мы можем использовать NSString:

let font = UIFont(name: "Palatino-Roman", size: 14.0)
let baselineAdjust = 1.0
let attrsDictionary =  [NSFontAttributeName:font, NSBaselineOffsetAttributeName:baselineAdjust] as [NSObject : AnyObject]
let str:NSString = "Hello World"
str.drawInRect(CGRectZero, withAttributes: attrsDictionary)

Ответ 2

Это немного сложнее, чем раньше, и вы не можете использовать минимальный размер шрифта, но должны использовать минимальный коэффициент масштабирования шрифта. В IOS SDK есть ошибка, которая разбивает ее для большинства случаев использования (см. Примечания внизу). Вот что вам нужно сделать:

// Create text attributes
NSDictionary *textAttributes = @{NSFontAttributeName: [UIFont systemFontOfSize:18.0]};

// Create string drawing context
NSStringDrawingContext *drawingContext = [[NSStringDrawingContext alloc] init];
drawingContext.minimumScaleFactor = 0.5; // Half the font size

CGRect drawRect = CGRectMake(0.0, 0.0, 200.0, 100.0);
[string drawWithRect:drawRect
             options:NSStringDrawingUsesLineFragmentOrigin
          attributes:textAttributes
             context:drawingContext];

Примечания:

  • Кажется, что в iOS 7 SDK есть ошибка, по крайней мере, до версии 7.0.3: если вы укажете пользовательский шрифт в атрибутах, miniumScaleFactor будет проигнорирован. Если вы передаете nil для атрибутов, текст будет масштабирован правильно.

  • Важна опция NSStringDrawingUsesLineFragmentOrigin. Он сообщает системе рисования текста, что прямая прямая рисования должна находиться в верхнем левом углу.

  • Невозможно установить базовую настройку с помощью нового метода. Вы должны сделать это сами, сначала позвонив boundingRectWithSize:options:attributes:context:, а затем отредактировав прямоугольник, прежде чем передавать его на drawWithRect:options:attributes:context.