Iphone 如何在UILabel中绘制垂直文本
我目前正在标签中绘制垂直中文文本。以下是我试图实现的目标,尽管有汉字:Iphone 如何在UILabel中绘制垂直文本,iphone,core-graphics,uilabel,Iphone,Core Graphics,Uilabel,我目前正在标签中绘制垂直中文文本。以下是我试图实现的目标,尽管有汉字: 我一直计划绘制每个角色,将每个角色向左旋转90度,然后通过仿射变换旋转整个标签以获得最终结果。然而,这感觉非常复杂。有没有一种更简单的方法来绘制文本,而不需要我所缺少的复杂的CoreGraphics魔法?好吧,你可以像下面这样做: labelObject.numberOfLines = 0; labelObject.lineBreakMode = NSLineBreakByCharWrapping; 设置框的高度为100
我一直计划绘制每个角色,将每个角色向左旋转90度,然后通过仿射变换旋转整个标签以获得最终结果。然而,这感觉非常复杂。有没有一种更简单的方法来绘制文本,而不需要我所缺少的复杂的CoreGraphics魔法?好吧,你可以像下面这样做:
labelObject.numberOfLines = 0;
labelObject.lineBreakMode = NSLineBreakByCharWrapping;
设置框的高度为100,宽度为20,这样就可以了
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 30, 100)];
lbl.transform = CGAffineTransformMakeRotation((M_PI)/2);
如果要旋转整个标签(包括字符),可以按如下操作:
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)];
尝试了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;
}
享受吧 这是另一种绘制垂直文本的方法,通过子类化
UILabel
。但这与问题想要的有所不同
目标-C
示例图像如下所示:
敏捷的
它可以放在故事板上,直接观看结果。与图像一样,它的框架将包含垂直文本。而文本属性,如textAlignment
,font
,也能很好地工作
斯威夫特4
斯威夫特5
更简单的CGAffineTransform方法
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var verticalText: UILabel
override func viewDidLoad() {
verticalText.transform = CGAffineTransform(rotationAngle:CGFloat.pi/2)
}
}
你现在做的很好。这并不复杂,但我最终还是这样做了。因为iOS 6.0
UILineBreakModeCharacterWrap
已被弃用。使用NSLineBreakByCharWrapping
。+1,虽然这不能完全回答OP的问题(这也会旋转字符,而他显然希望使用列样式的文本),但对于像我这样希望旋转文本的其他人来说,这是一个非常有用的答案所有答案都有效,但这是最好的答案。我做了(-m_pi/4),看起来很酷。ThanksI使用了此方法,但在Swift 3.0中使用了:var newString:String=“
表示0中的i..
newString+=”\(originalString[originalString.index(originalString.startIndex,offsetBy:i)])\n“
@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
@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)
}
}
import UIKit
class VerticalLabel : UILabel {
private var _text : String? = nil
override var text : String? {
get {
return _text
}
set {
self.numberOfLines = 0
self.textAlignment = .center
self.lineBreakMode = .byWordWrapping
_text = newValue
if let t = _text {
var s = ""
for c in t {
s += "\(c)\n"
}
super.text = s
}
}
}
}
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var verticalText: UILabel
override func viewDidLoad() {
verticalText.transform = CGAffineTransform(rotationAngle:CGFloat.pi/2)
}
}