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);

如果要旋转整个标签(包括字符),可以按如下操作:

  • 首先将QuartzCore库添加到项目中
  • 创建标签:

    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)
        }
    }