創(chuàng)建標(biāo)簽流

UICollectionView可以創(chuàng)建高度不一的瀑布流,但是沒有辦法處理寬度不一的標(biāo)簽流.現(xiàn)在我們就用代碼來自己創(chuàng)建一個標(biāo)簽流,會分別使用frame硬編碼布局和autolayout自動布局兩種方式來實現(xiàn)

一. frame硬編碼布局

最終完成效果如下

QQ20160308-1.png
  1. 新建一個Single View Application的iOS Project,我們就在初始創(chuàng)建的ViewController上面編寫代碼
  2. 我們創(chuàng)建數(shù)據(jù)源(TagLabel是一個自定義的UILabel,加入了文本和邊框的padding,也可以直接使用UILabel,一樣可以實現(xiàn)效果)
    var dataSource = [String]()
    var labels = [TagLabel]()
    //mock 數(shù)據(jù)數(shù)量
    let count = 20
  1. 在viewDidLoad中初始化數(shù)據(jù)
override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        for _ in 0..<count {
            dataSource.append(RandomString.sharedInstance.getRandomStringOfLength(3 + Int(arc4random_uniform(7))))
        }
        for i in 0..<count {
            labels.append(TagLabel())
            labels[i].text = dataSource[i]
            labels[i].padding = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
            labels[i].layer.borderColor = UIColor.greenColor().CGColor
            labels[i].layer.borderWidth = 1
            labels[i].layer.cornerRadius = 8
            
            self.view.addSubview(labels[i])
        }
        
        layoutLabels()
    }
  1. 布局標(biāo)簽流
func layoutLabels() {
        
        let width = UIScreen.mainScreen().bounds.width
        //標(biāo)簽間水平間距
        let horizontalSpace : CGFloat = 12
        //標(biāo)簽行間距
        let verticalSpace : CGFloat = 12
        //左邊已經(jīng)填充長度
        var left : CGFloat = 0
        //頂部已經(jīng)填充高度
        var top : CGFloat = 0
        
        var lineLabels = [[TagLabel]]()
        var lineLabel = [TagLabel]()
        var lineStartSpace = [CGFloat]()
        for label in labels {
            let labelWidth = label.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).width
            if left + labelWidth + horizontalSpace > width {
                lineLabels.append(lineLabel)
                lineLabel = [TagLabel]()
                lineStartSpace.append((width - left + horizontalSpace) / 2)
                left = 0
            }
            
            left += labelWidth + horizontalSpace
            lineLabel.append(label)
        }
        
        lineLabels.append(lineLabel)
        lineStartSpace.append((width - left + horizontalSpace) / 2)

        top = verticalSpace + 20
        var size : CGSize = CGSize.zero
        for (index, oneLine) in lineLabels.enumerate() {
            left = lineStartSpace[index]
            for label in oneLine {
                size = label.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
                label.frame = CGRect(x: left, y: top, width: size.width, height: size.height)
                left += size.width + horizontalSpace
                
            }
            top += size.height + verticalSpace
        }
        
    }
  1. RandomString是我自己寫的一個生成隨機長度的字符串方法,代碼如下:
///隨機字符串生成
class RandomString {
    let characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    
    /**
     生成隨機字符串,
     
     - parameter length: 生成的字符串的長度
     
     - returns: 隨機生成的字符串
     */
    func getRandomStringOfLength(length: Int) -> String {
        var ranStr = ""
        for _ in 0..<length {
            let index = Int(arc4random_uniform(UInt32(characters.characters.count)))
            ranStr.append(characters[characters.startIndex.advancedBy(index)])
        }
        return ranStr
        
    }
    
    
    private init() {
        
    }
    static let sharedInstance = RandomString()
}
  1. 以上就是硬編碼布局標(biāo)簽流的所有代碼了,運行看看效果吧~

二. AutoLayout自動布局

待續(xù)...

完整代碼見Github: https://github.com/growold/SwiftLearn 的Learn02TagFlow項目.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汰现,一起剝皮案震驚了整個濱河市带欢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌槐壳,老刑警劉巖猿推,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煮纵,死亡現(xiàn)場離奇詭異机错,居然都是意外死亡褐捻,警方通過查閱死者的電腦和手機掸茅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柠逞,“玉大人昧狮,你說我怎么就攤上這事“遄常” “怎么了逗鸣?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我撒璧,道長透葛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任卿樱,我火速辦了婚禮僚害,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘繁调。我一直安慰自己萨蚕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布蹄胰。 她就那樣靜靜地躺著门岔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪烤送。 梳的紋絲不亂的頭發(fā)上寒随,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音帮坚,去河邊找鬼妻往。 笑死,一個胖子當(dāng)著我的面吹牛试和,可吹牛的內(nèi)容都是我干的讯泣。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼阅悍,長吁一口氣:“原來是場噩夢啊……” “哼好渠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起节视,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤拳锚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寻行,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霍掺,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年拌蜘,在試婚紗的時候發(fā)現(xiàn)自己被綠了杆烁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡简卧,死狀恐怖兔魂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情举娩,我是刑警寧澤析校,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布构罗,位于F島的核電站,受9級特大地震影響勺良,放射性物質(zhì)發(fā)生泄漏绰播。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一尚困、第九天 我趴在偏房一處隱蔽的房頂上張望蠢箩。 院中可真熱鬧,春花似錦事甜、人聲如沸谬泌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掌实。三九已至,卻和暖如春邦马,著一層夾襖步出監(jiān)牢的瞬間贱鼻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工滋将, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留邻悬,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓随闽,卻偏偏與公主長得像父丰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掘宪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容