import UIKit
import CoreText class ViewController: UIViewController { override func viewDidLoad() {
super.viewDidLoad() print(UIFont.familyNames) let font = UIFont(name: "Heiti SC", size: 18)
let textStr = "Hi, I'm lilei, what's your name please? Are you Han Meimei?" let label = UILabel(frame: CGRect(x: 10, y: 30, width: 100, height: 400))
self.view.addSubview(label)
label.font = font
label.numberOfLines = 0
label.text = textStr print(getLines(text: textStr, font: font! , rect: CGRect(x: 10, y: 30, width: 100, height: 400))) } func getLines(text: String, font: UIFont, rect:CGRect) -> [String] { let fontName: CFString = font.fontName as CFString
let myFont = CTFontCreateWithName(fontName, font.pointSize, nil)
let attStr = NSMutableAttributedString(string: text)
attStr.addAttribute(kCTFontAttributeName as NSAttributedString.Key, value: myFont, range: NSMakeRange(0, attStr.length))
let frameSetter: CTFramesetter = CTFramesetterCreateWithAttributedString(attStr)
let path: CGMutablePath = CGMutablePath()
path.addRect(CGRect(x: 0, y: 0, width: rect.size.width, height: CGFloat.greatestFiniteMagnitude))
let frame: CTFrame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, nil)
let lines = CTFrameGetLines(frame) as Array
var linesArray = [String]() for line in lines {
let lineRef: CTLine = line as! CTLine
let lineRange: CFRange = CTLineGetStringRange(lineRef)
let range: NSRange = NSMakeRange(lineRange.location, lineRange.length)
let subStr = text.substring(from: range.location, length: range.length)
linesArray.append(subStr)
} return linesArray
} } extension String {
func substring(from: Int?, to: Int?) -> String {
if let start = from {
guard start < self.characters.count else {
return ""
}
} if let end = to {
guard end >= 0 else {
return ""
}
} if let start = from, let end = to {
guard end - start >= 0 else {
return ""
}
} let startIndex: String.Index
if let start = from, start >= 0 {
startIndex = self.index(self.startIndex, offsetBy: start)
} else {
startIndex = self.startIndex
} let endIndex: String.Index
if let end = to, end >= 0, end < self.characters.count {
endIndex = self.index(self.startIndex, offsetBy: end + 1)
} else {
endIndex = self.endIndex
} return String(self[startIndex ..< endIndex])
} func substring(from: Int) -> String {
return self.substring(from: from, to: nil)
} func substring(to: Int) -> String {
return self.substring(from: nil, to: to)
} func substring(from: Int?, length: Int) -> String {
guard length > 0 else {
return ""
} let end: Int
if let start = from, start > 0 {
end = start + length - 1
} else {
end = length - 1
} return self.substring(from: from, to: end)
} func substring(length: Int, to: Int?) -> String {
guard let end = to, end > 0, length > 0 else {
return ""
} let start: Int
if let end = to, end - length > 0 {
start = end - length + 1
} else {
start = 0
} return self.substring(from: start, to: to)
}
}

swift的String处理的更多相关文章

  1. Swift 中 String 取下标及性能问题

    Swift 中 String 取下标及性能问题 取下标 String String 用 String.Index 取下标(subscript)得到 Character,String.Index 要从 ...

  2. Swift中String和NSString的一个不同之处

    我们知道在Swift中String和NSString是可以互相转换使用的-额-应该是在绝大数情况下可以互相转换使用.在某些情况下可能还有一丝丝略微的差别:比如在涉及到处理字符串中字符索引的时候. 我们 ...

  3. [Swift]扩展String类:extension String

    请参考本博客另一篇技术博文: <[Swift]字符串(String类.NSString类)常用操作> extension String { //获取字符串首字符 var first: St ...

  4. Swift的String与OC的NSString的区别

    Swift的String类型是值类型.如果你创建了一个新的字符串值,那么当其进行常量.变量赋值操作或在函数/方法中传递时,会进行值拷贝. 在不同的情况下,都会对已有字符串值创建新的副本,并对该新副本进 ...

  5. Swift 01.String

    1.字符串拼接 var num1 = "hello,world" var name = "xiaoming" var age = let student = n ...

  6. Swift - 16 - String.Index和Range

    //: Playground - noun: a place where people can play import UIKit var str = "Welcome to Play Sw ...

  7. swift 中String常用操作

    1.  字符串定义 var s = "aaaaaa" // 两个字符串均为空并等价. var emptyString = ""   var anotherEmp ...

  8. Swift中String与NSDate的互相转换

    其实每种编程语言,我都觉得String和日期对象的相互转换是一种十分麻烦的事情,Swift也不例外.这篇博客记录了我学到的String与NSDate的互相转换方法,供大家参考. 从String转为NS ...

  9. swift 设置string 中汉字中变色等处理代码

    我们在做弹窗 或者显示label string的时候经常会用到字体变色 变大 等特殊处理, swift中提供一个函数 NSMutableAttributedString 使用方法简介 var main ...

  10. [Swift]字符串(String类、NSString类)常用操作

    NS是Cocoa类对象类型的前缀,来源于乔布斯建立的另一家公司--NeXTNSString的使用方法,和Swift语言中的String有很多相似之处. 1.字符串的定义String类 var str1 ...

随机推荐

  1. 【leetcode】lower_bound

    int binary_search(const vector<int>& stones,int val){ int sz=stones.size(); ,r=sz-; while( ...

  2. phoenixframework集成了所有自动化测试的思想的平台。mark一下。

    phoenixframework http://www.cewan.la/

  3. Codeforces 655E Beautiful Subarrays【01trie树】

    题目链接: http://codeforces.com/contest/665/problem/E 题意: 求异或值大于给定K的区间个数. 分析: 首先我们可以得到区间前缀的异或值. 这样我们将这个前 ...

  4. Codeforces 713D Animals and Puzzle(二维ST表+二分答案)

    题目链接 Animals and Puzzle 题意  给出一个1e3 * 1e3的01矩阵,给出t个询问,每个询问形如x1,y1,x2,y2 你需要回答在以$(x1, y1)$为左上角,$(x1, ...

  5. 网络安全(超级详细)零基础带你一步一步走进缓冲区溢出漏洞和shellcode编写!

    零基础带你走进缓冲区溢出,编写shellcode. 写在前面的话:本人是以一个零基础者角度来带着大家去理解缓冲区溢出漏洞,当然如果你是开发者更好. 注:如果有转载请注明出处!创作不易.谢谢合作. 0. ...

  6. pycharm整体缩进的快捷键

    选中多行,按tab进行缩进,按tab+shift去除缩进

  7. 三期_day05_Dao层的准备工作_II

    工作文件夹: 实体类:UserInfo.java package com.yc.crm.entity; import java.util.Date; public class UserInfo { p ...

  8. JS创建对象几种不同方法具体解释

    1.工厂模式 弊端:没有解决对象的识别问题,即怎么知道一个对象的类型. 2.构造函数模式 与工厂模式相比: 1.没有显式的创建对象 2.直接将属性和方法赋给了this对象 3.没有return语句 要 ...

  9. 跟阿根一起学Java Web开发一:开发环境搭建及JSPGen基础配置

    JSPGenSDF软件开发框架(于2014年5月5号公布4.0版).简称JSPGen,专用Java Web方面平台式软件开发,整个框架也能够说是前台与后台的一个粘合剂,如今对JSPGenSDF进行开发 ...

  10. scss - 语法

    1.在一个样式导入另一个样式(@import "example.css") 2.scss单行注释不会显示出来 3.强大的变量(定义后,全局可使用) 4.全局默认变量(加!defau ...