在开发一款中国文化的app时,需要以竖排文字的方式展示诗文。 在CSS中,有一个文字方向的属性可以用来直接显示竖排文字,但是在iOS中并没有直接提供,所以扩展一下String类,可以返回一个竖排多行文字

先看一下效果:


简单做一下说明:

convertVerticalText 是将多行文字转变为多列文字的处理过程,类似于矩阵的对角。

首先获取待转换的文字一共有多少行,那么也就对应着转换后每一行有几个字。

由于每一行的文字个数未必相同,在转换为列的时候,就意味着会有空白,所以要获取最长一行有多少个字符。 每次在取完有效字符后,如果没有达到最长字符时,就要自动填入空白字符了。


// Auto convert text to Vertical text on UILabel
extension UILabel{

    func toVertical( gapLength:Int = 1,spaceLength:Int = 1, inverse:Bool = true ){

        if self.text != nil{

            self.text = self.text!.convertVerticalText(gapLength: gapLength, spaceLength: spaceLength, inverse: inverse)
        }

    }

}

extension String{

    func convertVerticalText( gapLength:Int = 1,spaceLength:Int = 1, inverse:Bool = true ) -> String{

        let gap = String.init(repeating: " ", count: gapLength)
        let space = String.init(repeating: " ", count: spaceLength)
        let sentences = self.split(separator: "\n")
        let sequence = 0 ..< sentences.count

        var T:[String] = []
        var WL:[Int] = []

        var maxLength = sentences[0].count

        // 统计最长句
        for i in sequence {
            maxLength = max(maxLength, sentences[i].count)
        }

        // 初始化
        for _ in 0...maxLength-1 {
            T.append("")
            WL.append(0)
        }

        for i in sequence {

            var idx = 0

            for w in sentences[i]{

                if w == " "{
                    T[idx].append( space )
                }else{
                    T[idx].append( w )
                }

                WL[idx] += 1

                if( WL[idx] < sentences.count ){
                    T[idx].append(gap)
                }

                idx += 1
            }
            if idx < maxLength-1{
                for sup in idx ... maxLength-1 {

                    T[sup].append(space)

                    WL[sup-1] += 1

                }
            }

        }

        var _T:String = ""

        for single in T {

            _T.append( inverse ? String(single.reversed()) : single )
            _T.append("\n")
        }

        return _T
    }

}



文章地址:




标签: none

仅有一条评论

  1. 感谢分享 赞一个

添加新评论