在开发一款中国文化的app时,需要以竖排文字的方式展示诗文。 在CSS中,有一个文字方向的属性可以用来直接显示竖排文字,但是在iOS中并没有直接提供,所以扩展一下String类,可以返回一个竖排多行文字
先看一下效果:
简单做一下说明:
convertVerticalText 是将多行文字转变为多列文字的处理过程,类似于矩阵的对角。
首先获取待转换的文字一共有多少行,那么也就对应着转换后每一行有几个字。
由于每一行的文字个数未必相同,在转换为列的时候,就意味着会有空白,所以要获取最长一行有多少个字符。 每次在取完有效字符后,如果没有达到最长字符时,就要自动填入空白字符了。
代码语言:javascript复制// 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
}
}