<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了iOS開發UI之弧形文字的具體程式碼,供大家參考,具體內容如下
要實現類似效果的弧形文字,網上找了一圈沒找到有簡單的實現方式,CATextLayer也不能使用path來用路徑繪製出來,所以我採用了一個曲線救國的方式。
1.先找到文字的中心點 ,用一段圓弧將這些中心點連線起來
2.過每個中心點做圓弧的切線,找到圓弧的圓點O,連線O與每個中心點
3.現在把字去掉,來找點
圓點為O,圓弧最左邊為A,最右邊為B,頂點為N,AB與OP交點為P,由圓的垂徑定理可以知道,AB是垂直於OP的。現在設AB長度為w,NP長度為h,OA、OA都是圓的半徑,長度為r,則OP為r-h。將圓弧上面部分用一個矩形包起來,這個就可以作為顯示弧形文字的view,如圖。
由圖中可以知道△AOP是直角三角形,根據勾股定理,則有r²=(w/2)²+(r-h)²,可以知道r=h/2+w²/8h,h是view的height,w是view的width,這兩個是已知條件,所以可以得到圓的半徑r。
假設弧形文字只有3個字,那麼這三個字就分別在A、N、B的位置上,現在△AOP的三邊都是已知的,那麼可以求角AOP的角度α,用反三角函數arcsin或者arccos,則可以獲得α的具體值。這個角α就是每個夾角的角度,弧形文字長度不固定時計算方式同理。
4.計算每個點的位置座標
以view的左上角為原點(0,0),那麼圓點O的座標就是(w/2,r)。如果以圓點O為直角座標系圓點,那麼頂點N的起始弧度就是-π/2,將其設為startAngle。其他每個點的座標就是(rcos(startAngle+αi),rsin(startAngle+αi)),其中i是每個點的索引(從0開始)。再將其轉換到view左上角是原點的座標系,則座標為(w/2+rcos(startAngle+αi),r+rsin(startAngle+αi)),就是x和y分別加上圓點O的x和y。
1.定義一些變數
var textLength:Int = 0 // 文字長度 var viewWidth:CGFloat = 0 // view寬度 var viewHeight:CGFloat = 0 // view高度 var arcRadius:CGFloat = 0 // 圓半徑 var textHeight:CGFloat = 20 // 文字高度 var totalRadian:CGFloat = 0 // 總弧度 var eachRadian:CGFloat = 0 // 每個夾角弧度
2.初始化變數
viewWidth = view.frame.size.width - textHeight * 2 viewHeight = view.frame.size.height - textHeight arcRadius = viewHeight / 2 + viewWidth * viewWidth / 8 / viewHeight // 根據垂徑定理得到 textLength = text.isEmpty ? 1 : text.count totalRadian = asin(viewWidth / 2 / arcRadius) * 2 // 用反三角函數求角度,乘2之前得到的是一半的角度,乘2得到總角度(弧度制) eachRadian = totalRadian / (CGFloat(textLength) - 1)
3.找點顯示文字
// 先移除之前建立的 view.subviews.forEach { (subview) in subview.removeFromSuperview() } let startAngle:CGFloat = -CGFloat.pi / 2 - totalRadian / 2 // 起始角度,從左到右,取第一個字元的位置為起始角度 for i in 0..<textLength { let angle = startAngle + eachRadian * CGFloat(i) let x:CGFloat = arcRadius * cos(angle) let y:CGFloat = arcRadius * sin(angle) let center = CGPoint(x: frame.size.width / 2 + x, y: arcRadius + textHeight + y) // 各個label中點座標 if text.isEmpty {return} let label = UILabel() label.textColor = .black label.font = UIFont.systemFont(ofSize: 15) let character:Character = text[text.index(text.startIndex, offsetBy: i)] // 獲取對應索引位置上的字元 label.text = String(character) label.sizeToFit() label.center = center view.addSubview(label) }
此時,繪製出來的文字方向還是正的,沒有發生偏轉
我們需要分別將每個文字旋轉一定的角度。在最頂點N的文字的角度是正的,沒有發生偏轉,那麼我們就以N點文字為基準點,經過觀察論證,每個文字的旋轉角度和每個點與圓心O的連線和線段ON形成的夾角一致,即eachRadian*i - totalRadian / 2。
4.旋轉文字
let alpha = angle + CGFloat.pi / 2 // 這裡的angle和上面迴圈裡的是同一個變數 label.transform = CGAffineTransform(rotationAngle: alpha)
至此,基本實現了弧形文字的效果。不過還是有點問題,當文字較少時,文字之間的間隙很大
為了解決這個問題,我們可以給每個夾角設定一個固定值
5.固定夾角值
eachRadian = 0.1 // 0.85 // 此處是弧度值 ,可以任意一個角度,0.1弧度約為5.7度 totalRadian = eachRadian * (CGFloat(textLength) - 1)
最後,在不設定固定角度時,為了不讓每次文字的開始結束都在view的最下邊開始,可以將totalRadian乘以一個小於1的值,來減小角度。
totalRadian = asin(viewWidth / 2 / arcRadius) * 2 * 4 / 5
6.用CATextLayer
如果覺得UILbel佔用資源更大的話,可以考慮用更輕量級的CATextLayer
let textLayer = CATextLayer() textLayer.bounds = CGRect(x: 0, y: 0, width: 20, height: 20) let character:Character = text[text.index(text.startIndex, offsetBy: i)] textLayer.string = String(character) textLayer.foregroundColor = UIColor.black.cgColor textLayer.font = UIFont.systemFont(ofSize: 15) textLayer.fontSize = 15 textLayer.alignmentMode = .center textLayer.contentsScale = UIScreen.main.scale textLayer.position = center view.layer.addSublayer(textLayer) // 旋轉 let alpha = angle + CGFloat.pi / 2 let trans = CATransform3DIdentity textLayer.transform = CATransform3DRotate(trans, alpha, 0, 0, 1)
實現的效果是一樣的。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45