Ответ 1
Ну, вы можете сделать, как показано ниже:
labelObject.numberOfLines = 0;
labelObject.lineBreakMode = NSLineBreakByCharWrapping;
и setFrame с - height: 100, width: 20 Он будет работать нормально.
В настоящее время я работаю над рисованием вертикального китайского текста в ярлыке. Вот чего я пытаюсь достичь, хотя и с китайскими персонажами:
Я планировал рисовать каждого персонажа, поворачивать каждый символ на 90 градусов влево, а затем поворачивать всю метку с помощью аффинных преобразований, чтобы получить окончательный результат. Однако он чувствует себя ужасно сложным. Есть ли более простой способ рисовать текст без сложной магии CoreGraphics, которую я пропускаю?
Ну, вы можете сделать, как показано ниже:
labelObject.numberOfLines = 0;
labelObject.lineBreakMode = NSLineBreakByCharWrapping;
и setFrame с - height: 100, width: 20 Он будет работать нормально.
Работает
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 30, 100)];
lbl.transform = CGAffineTransformMakeRotation((M_PI)/2);
Пробовал метод, предложенный Simha.IC, но для меня это не сработало. Некоторые символы тоньше, чем другие, и размещаются по два на линии. Например.
W
ai
ti
n
g
Решение для меня состояло в том, чтобы создать метод, который преобразует строку в многострочный текст, добавив \n
после каждого символа. Здесь метод:
- (NSString *)transformStringToVertical:(NSString *)originalString
{
NSMutableString *mutableString = [NSMutableString stringWithString:originalString];
NSRange stringRange = [mutableString rangeOfString:mutableString];
for (int i = 1; i < stringRange.length*2 - 2; i+=2)
{
[mutableString insertString:@"\n" atIndex:i];
}
return mutableString;
}
Затем вы просто установите ярлык следующим образом:
label.text = [self transformStringToVertical:myString];
CGRect labelFrame = label.frame;
labelFrame.size.width = label.font.pointSize;
labelFrame.size.height = label.font.lineHeight * myString.length;
label.frame = labelFrame;
Наслаждайтесь!
Если вы хотите повернуть всю метку (включая символы), вы можете сделать это следующим образом:
Создайте метку:
UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 30.0)];
[label setText:@"Label Text"];
Поверните метку:
[label setTransform:CGAffineTransformMakeRotation(-M_PI / 2)];
В зависимости от того, как вы хотите поместить метку, вам может понадобиться установить опорную точку. Это устанавливает точку, вокруг которой происходит поворот. Например:
[label.layer setAnchorPoint:CGPointMake(0.0, 1.0)];
Это еще один способ рисования вертикального текста, путем подкласса UILabel
. Но это какой-то вид того, чего хочет этот вопрос.
@implementation MyVerticalLabel
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
CGContextRef context = UIGraphicsGetCurrentContext();
CGAffineTransform transform = CGAffineTransformMakeRotation(-M_PI_2);
CGContextConcatCTM(context, transform);
CGContextTranslateCTM(context, -rect.size.height, 0);
CGRect newRect = CGRectApplyAffineTransform(rect, transform);
newRect.origin = CGPointZero;
NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
textStyle.lineBreakMode = self.lineBreakMode;
textStyle.alignment = self.textAlignment;
NSDictionary *attributeDict =
@{
NSFontAttributeName : self.font,
NSForegroundColorAttributeName : self.textColor,
NSParagraphStyleAttributeName : textStyle,
};
[self.text drawInRect:newRect withAttributes:attributeDict];
}
@end
Образец изображения следующий:
Он может надеть раскадровку и посмотреть результат напрямую. Как и изображение, он будет содержать вертикальный текст. А текстовые атрибуты, такие как textAlignment
, font
, тоже хорошо работают.
@IBDesignable
class MyVerticalLabel: UILabel {
override func drawRect(rect: CGRect) {
guard let text = self.text else {
return
}
// Drawing code
let context = UIGraphicsGetCurrentContext()
let transform = CGAffineTransformMakeRotation( CGFloat(-M_PI_2))
CGContextConcatCTM(context, transform)
CGContextTranslateCTM(context, -rect.size.height, 0)
var newRect = CGRectApplyAffineTransform(rect, transform)
newRect.origin = CGPointZero
let textStyle = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle
textStyle.lineBreakMode = self.lineBreakMode
textStyle.alignment = self.textAlignment
let attributeDict: [String:AnyObject] = [
NSFontAttributeName: self.font,
NSForegroundColorAttributeName: self.textColor,
NSParagraphStyleAttributeName: textStyle,
]
let nsStr = text as NSString
nsStr.drawInRect(newRect, withAttributes: attributeDict)
}
}
override func draw(_ rect: CGRect) {
guard let text = self.text else {
return
}
// Drawing code
if let context = UIGraphicsGetCurrentContext() {
let transform = CGAffineTransform( rotationAngle: CGFloat(-Double.pi/2))
context.concatenate(transform)
context.translateBy(x: -rect.size.height, y: 0)
var newRect = rect.applying(transform)
newRect.origin = CGPoint.zero
let textStyle = NSMutableParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
textStyle.lineBreakMode = self.lineBreakMode
textStyle.alignment = self.textAlignment
let attributeDict: [NSAttributedStringKey: AnyObject] = [NSAttributedStringKey.font: self.font, NSAttributedStringKey.foregroundColor: self.textColor, NSAttributedStringKey.paragraphStyle: textStyle]
let nsStr = text as NSString
nsStr.draw(in: newRect, withAttributes: attributeDict)
}
}