最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift設(shè)置UILabel內(nèi)邊距的實(shí)例代碼

 更新時(shí)間:2021年10月13日 16:34:13   作者:我為雙魚(yú)狂  
有時(shí)候,我們需要一個(gè)顯示文字,又想這些文字與邊界之間有自定義的邊距,所以下面這篇文章主要給大家介紹了關(guān)于Swift設(shè)置UILabel內(nèi)邊距的相關(guān)資料,需要的朋友可以參考下

摘要

拿來(lái)即用短時(shí)間效率雖然挺高的,但是拿來(lái)的東西沒(méi)有消化一次,就無(wú)法得心應(yīng)手的使用它。

這次的探索思路就是,查詢官方文檔,設(shè)置不同的值測(cè)試單個(gè)方法中參數(shù)的變化,之后測(cè)試兩個(gè)方法的執(zhí)行順序,處理的思路,最后思考總結(jié)。

在總結(jié)方法的處理邏輯時(shí),使用偽代碼的方式梳理方法的執(zhí)行思路。避免解釋文本太多,增加理解的成本。

最近在學(xué)習(xí)小程序開(kāi)發(fā),接觸到 flex 方式布局,很喜歡這種快速和方便的方式。所以當(dāng)遇到一個(gè)頁(yè)面上居中顯示文本的需求的時(shí)候,就想直接在 UIlabel 上處理,然后在UIlabel上設(shè)置它的內(nèi)邊距(類似 flex 布局)。而不是先放一個(gè) View。然后在這個(gè)view 上放置一個(gè) UILabel 控件,通過(guò)設(shè)置 UILabel 控件距離父 View 的距離實(shí)現(xiàn)。

先看代碼實(shí)現(xiàn),下面的代碼,是搜索之后的解決方式,如果只是拿去使用,直接復(fù)制到項(xiàng)目中即可。需要在設(shè)置text前設(shè)置textInsets

class SHLabel: UILabel {
​
   var textInsets: UIEdgeInsets = .zero
​
   override func drawText(in rect: CGRect) {
       super.drawText(in: rect.inset(by: textInsets))
   }
   
   override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
       
       let insets = textInsets
       var rect = super.textRect(forBounds: bounds.inset(by: insets), limitedToNumberOfLines: numberOfLines)
       
       rect.origin.x -= insets.left
       rect.origin.y -= insets.top
       rect.size.width += (insets.left + insets.right)
       rect.size.height += (insets.top + insets.bottom)
       return rect
   }
}

為什么這種方式可以實(shí)現(xiàn)內(nèi)邊距?

接下來(lái)是梳理一下,為什么這樣實(shí)現(xiàn)。首先查看開(kāi)發(fā)者文檔,看代碼塊中這兩個(gè)方法是做什么的

函數(shù) drawText(in rect: CGRect) textRect(forBounds bounds:, limitedToNumberOfLines numberOfLines) -> CGRect
標(biāo)題 在rect的區(qū)域中繪制文本或者陰影 返回文本的繪制的 rect 區(qū)域
詳細(xì) 如果需要修改 label 中的繪圖行為,需要重寫這個(gè)方法。這個(gè)方法已經(jīng)配置用于繪圖的默認(rèn)環(huán)境和文本顏色,在重寫的方法中,可以自定義繪制方法,然后調(diào)用super或者自己進(jìn)行繪圖。 在系統(tǒng)執(zhí)行其他文本計(jì)算之前重寫這個(gè)方法(這個(gè)太難理解),如果調(diào)用 sizeToFit()和sizeThatFits(_:)會(huì)觸發(fā)這個(gè)方法
鏈接 https://developer.apple.com/documentation/uikit/uilabel/1620527-drawtext https://developer.apple.com/documentation/uikit/uilabel/1620545-textrect

之后驗(yàn)證這兩個(gè)方法的執(zhí)行順序,和各自的作用時(shí),發(fā)現(xiàn)當(dāng) UILabel 的 text 賦值時(shí),會(huì)首先調(diào)用textRect方法,之后drawText方法被調(diào)用。

textRect在當(dāng)文本rect的實(shí)際寬度大于設(shè)置UILabel的實(shí)際寬度時(shí),會(huì)再次被調(diào)用,當(dāng)然drawText也是在textRect兩次調(diào)用之后被調(diào)用。

textRect 的作用

看到這里,似乎可以理解開(kāi)發(fā)者文檔中提到的在系統(tǒng)執(zhí)行其他文本計(jì)算之前重寫這個(gè)方法了。這個(gè)方法的作用就是先獲取 UILabel 的 bounds 和 text 的行數(shù),通過(guò)調(diào)用 super 方法計(jì)算出 text 的 rect 區(qū)域,返回給系統(tǒng)。

經(jīng)過(guò)多次測(cè)試驗(yàn)證發(fā)現(xiàn)執(zhí)行邏輯(偽代碼):

  // frame 是設(shè)置 UIlabel 時(shí)的 frame
  if numberOfLines == 1 {
      textRect 被調(diào)用
      return retc 的 width = text 的 widht
  } else {
      if text 文本的 width < frame 的 width {
          text Rect 被調(diào)用
          return retc 的 width = text 的 widht
      } else {
          text Rect 被調(diào)用兩次后
   
          以 frame 的 wdith 為限制,計(jì)算出 text 的 height
          return rect 的 size = (frame 的 width,text 的 height)
      }
  }

drawText 的作用

看drawText中的rect參數(shù),就是textRect方法返回的rect。text文本的實(shí)際繪制區(qū)域就通過(guò)重寫drawText方法,并在其中調(diào)用它的super方法實(shí)現(xiàn)。

經(jīng)過(guò)多次驗(yàn)證,這里的rect并不完全是textRect方法中返回的rect。它們之間的關(guān)系是(偽代碼):

  // frame 是設(shè)置 UILabel 的 frame
  // rect 是 `textRect` 返回的
  dx = frame.x
  dy = frame.y
  if frame.width 確定不變 {
      dwidth = frame.width
  } else {
      dwidth = rect.width
  }
  if frame.height 確定不變 {
      dheight = frame.height
  } else {
      dheight = rect.width
  }
   
  return drawText 中的 rect(dx,dy,dwidth,dheight)

再問(wèn):為什么用這種方式實(shí)現(xiàn)內(nèi)邊距?

耐心看完這兩個(gè)方法之后,對(duì)題目中的問(wèn)題,多少有些思路了。那么就理順一下這個(gè)思路。

首先確定一個(gè)共識(shí),就是設(shè)置UILabel的內(nèi)邊距,是確定UILabel的frame區(qū)域里面,調(diào)整text的顯示區(qū)域。有了這個(gè)共識(shí),接下來(lái)就好辦了。

  • 第一步就要用textRect方法獲取到text的顯示區(qū)域,默認(rèn)text的顯示區(qū)域和UILabel的bounds區(qū)域是一樣的
  • 那就需要和咱們自己設(shè)置的內(nèi)邊距值計(jì)算獲取到新的text文本的rect區(qū)域。
  • 最后就用drawText方法重新繪制一下text的rect區(qū)域顯示。

那么為什么要用這種方式實(shí)現(xiàn)呢?因?yàn)槟壳爸挥羞@兩個(gè)方法和 text 文本直接有關(guān)系。

優(yōu)化

理論搞了這么多,到了輸出一些干貨的時(shí)候了。

如果,UILabel的frame已經(jīng)確定了,重要的是width和height確定了。那么textRect方法就可以不用重寫。

class SHLabel: UILabel {
​
   var textInsets: UIEdgeInsets = .zero
   override func drawText(in rect: CGRect) {
       super.drawText(in: rect.inset(by: textInsets))
   }
}

這里就可以看出,當(dāng)UILabel的height不確定時(shí),重寫textRect來(lái)幫忙確定UILabel的高度。經(jīng)過(guò)驗(yàn)證下來(lái),這個(gè)方法中的 x 和 y 也是不用處理的,什么時(shí)候會(huì)用到它?我目前還沒(méi)有遇到。

class SHLabel: UILabel {
​
   var textInsets: UIEdgeInsets = .zero
​
   override func drawText(in rect: CGRect) {
       super.drawText(in: rect.inset(by: textInsets))
   }
   
   override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
       let insets = textInsets
       var rect = super.textRect(forBounds: bounds.inset(by: insets), limitedToNumberOfLines: numberOfLines)
​
//       rect.origin.x -= insets.left
//       rect.origin.y -= insets.top
       rect.size.width += (insets.left + insets.right)
       rect.size.height += (insets.top + insets.bottom)
       return rect
   }
}

擴(kuò)展

文章到這里,就結(jié)束了。如果你是一個(gè)細(xì)節(jié)控,感覺(jué)textRect在需要還是不需要的時(shí)候都被調(diào)用。drawText方法,不管設(shè)置還是不設(shè)置內(nèi)邊距也總是被調(diào)用,會(huì)不會(huì)影響性能???

這里提供兩個(gè)方法解決:

  1. 可操作性的,就是盡量考慮需求,在不得不用的時(shí)候再使用
  2. 心理安慰性質(zhì)的,那就是放下。細(xì)想一下,這兩個(gè)方法都是重寫的方法,重寫的本質(zhì)是什么?那就是不執(zhí)行自己的方法,執(zhí)行重寫的方法。換句話說(shuō),就算系統(tǒng)不走重寫的方法,也要走自己的方法。而這些代碼對(duì)性能的影響,不值一提。

新發(fā)現(xiàn)

突然之間,有沒(méi)有發(fā)現(xiàn),咱們似乎也明白了,為什么UILabel不用固定它的height,它就可以自己確定高度,完全展示 text文本?你想.你細(xì)想...

總結(jié)

到此這篇關(guān)于Swift設(shè)置UILabel內(nèi)邊距的文章就介紹到這了,更多相關(guān)Swift設(shè)置UILabel內(nèi)邊距內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • swift在IOS應(yīng)用圖標(biāo)上添加提醒個(gè)數(shù)的方法

    swift在IOS應(yīng)用圖標(biāo)上添加提醒個(gè)數(shù)的方法

    本文是通過(guò)swift語(yǔ)言實(shí)現(xiàn)在應(yīng)用圖標(biāo)右上角添加消息個(gè)數(shù)提醒的功能,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-08-08
  • 利用Swift實(shí)現(xiàn)各類的CATransition動(dòng)畫(huà)詳解

    利用Swift實(shí)現(xiàn)各類的CATransition動(dòng)畫(huà)詳解

    CATransition動(dòng)畫(huà)主要在過(guò)渡時(shí)使用,比如兩個(gè)頁(yè)面層級(jí)改變的時(shí)候添加一個(gè)轉(zhuǎn)場(chǎng)效果。CATransition分為兩類,一類是公開(kāi)的動(dòng)畫(huà)效果,一類是非公開(kāi)的動(dòng)畫(huà)效果。這篇文章主要給大家介紹了關(guān)于如何利用Swift實(shí)現(xiàn)各類CATransition動(dòng)畫(huà)的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • Swift中非可選的可選值類型處理方法詳解

    Swift中非可選的可選值類型處理方法詳解

    Optional是Objective-C沒(méi)有的數(shù)據(jù)類型,是蘋果引入到Swift語(yǔ)言中的全新類型,它的特點(diǎn)就和它的名字一樣:可以有值,也可以沒(méi)有值,當(dāng)它沒(méi)有值時(shí),就是nil。下面這篇文章主要給大家介紹了關(guān)于Swift中非可選的可選值類型處理方法的相關(guān)資料,需要的朋友可以參考下。
    2017-11-11
  • Swift用final關(guān)鍵字來(lái)防止重寫

    Swift用final關(guān)鍵字來(lái)防止重寫

    final關(guān)鍵字在大多數(shù)的編程語(yǔ)言中都存在,表示不允許對(duì)其修飾的內(nèi)容進(jìn)行繼承或者重新操作。下面通過(guò)實(shí)例代碼給大家介紹swift用final關(guān)鍵字來(lái)防止重寫
    2016-12-12
  • SwiftUI圖片縮放、拼圖等處理教程

    SwiftUI圖片縮放、拼圖等處理教程

    SwiftUI是一種使用Swift語(yǔ)言在蘋果設(shè)備上構(gòu)建用戶界面的創(chuàng)新且簡(jiǎn)單的方式,下面這篇文章主要給大家介紹了關(guān)于SwiftUI圖片縮放、拼圖等處理的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Swift開(kāi)發(fā)中switch語(yǔ)句值綁定模式

    Swift開(kāi)發(fā)中switch語(yǔ)句值綁定模式

    本文給大家分享Swift開(kāi)發(fā)中switch語(yǔ)句值綁定模式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下
    2016-12-12
  • Swift高階函數(shù)contains?allSatisfy?reversed?lexicographicallyPrecedes用法示例

    Swift高階函數(shù)contains?allSatisfy?reversed?lexicographicallyPr

    這篇文章主要為大家介紹了Swift高階函數(shù)contains?allSatisfy?reversed?lexicographicallyPrecedes用法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Swift函數(shù)提前返回實(shí)例詳解

    Swift函數(shù)提前返回實(shí)例詳解

    函數(shù)相當(dāng)重要的,下面這篇文章主要給大家介紹了關(guān)于Swift函數(shù)提前返回的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Swift使用CoreData時(shí)遇到的一些填坑記錄

    Swift使用CoreData時(shí)遇到的一些填坑記錄

    這篇文章主要給大家記錄了在Swift使用CoreData時(shí)遇到的一些坑,以及介紹了CoreData在Swift 3.0中的一點(diǎn)改變,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-12-12
  • iOS Swift UICollectionView橫向分頁(yè)滾動(dòng),cell左右排版問(wèn)題詳解

    iOS Swift UICollectionView橫向分頁(yè)滾動(dòng),cell左右排版問(wèn)題詳解

    UICollectionView是iOS中比較常見(jiàn)的一個(gè)控件,這篇文章主要給大家介紹了關(guān)于iOS Swift UICollectionView橫向分頁(yè)滾動(dòng),cell左右排版問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12

最新評(píng)論

重庆市| 乐昌市| 维西| 礼泉县| 奈曼旗| 西畴县| 门源| 利津县| 玉门市| 灵丘县| 铁岭市| 黄骅市| 佛学| 北辰区| 景洪市| 寻乌县| 明水县| 阜南县| 西充县| 黑龙江省| 义马市| 济南市| 克什克腾旗| 沿河| 平顶山市| 新余市| 黑龙江省| 吉首市| 黄山市| 芦山县| 依兰县| 南和县| 久治县| 鄂托克旗| 马山县| 新巴尔虎左旗| 田林县| 澎湖县| 乳源| 阿克苏市| 贡山|