iOS App 介面設計教學:如何制作表格和集合視圖的組合介面
文章推薦指數: 80 %
本篇為在校大學生黃潤華先生的客座投稿,他主要使用Swift 進行開發,有時使用C 或者C++ 挑戰一些算法題目。
app-介面-1. 在iPhone 和iPad 的很多app 裏面 ...
iOSApp程式開發
iOSApp介面設計教學:如何制作表格和集合視圖的組合介面
AppCoda編輯團隊
Mar27,2019
17分鐘閱讀時間
In:iOSApp程式開發,UI
分享
本篇為在校大學生黃潤華先生的客座投稿,他主要使用Swift進行開發,有時使用C或者C++挑戰一些算法題目。
在iPhone和iPad的很多app裏面,我們都會看到許多用表格視圖和集合視圖制作起來的介面,大部分應該是表格視圖和集合視圖的組合介面。
比如我們在appstore裏面的遊戲欄或者App欄裏面會看到由表格視圖和集合視圖組合而成的漂亮介面。
又或者,你也會在快捷指令中心、Medium和AppleSupport裏面看到相類似的介面。
仔細分析不難發現這些介面的共同點,一般都是在表格視圖裏面添加集合視圖,但是呢,我們一般學習的表格視圖是用來展示一連串具有相同形式的介面的,就比如郵件裏面你收到的郵件的展示形式,或者微信裏面的聊天列表。
於是,我們再看一開始的那些照片,他們好像找不到甚麽相同的點,最多就是最上面的集合視圖可以找到共同點,但是集合視圖下一欄就立刻變成了表格視圖,甚至,表格視圖也有很多種形式,完全對應不起來呀,哪有甚麽共同特點?真是讓人匪夷所思。
為甚麽可以實現這種介面呢?別擔心,接下來就來學學如何制作表格視圖和集合視圖並存的介面吧。
示例模型
我這個介面是模仿AppleSupport寫的,它用三種方式來呈現數據,最開始是集合視圖,第二層是一個表格視圖,第三層也是一個表格視圖,不過這兩種表格視圖裏面的介面布局不太一樣。
看完我這一篇文章以後,你甚至可以自定義更多的表格視圖和集合視圖,這完全取決於你的想法。
你可以在GitHub上面找到完整的模型示例。
接下來我們就來學習一下吧。
制作集合視圖
我們首先來制作最開始的集合視圖,通過分析圖片,我們知道,我們需要自定義我們的集合視圖,每一個視圖裏面包含了一張照片、一個分類標簽、一個標題以及一個副標題(副標題可以沒有)。
1.添加TableViewController
我們先在storyboard裏面添加一個TableViewController,將它設為“isinitialViewController“。
然後選擇Editor->Embedin->NavigationController。
點擊NavigationController,將標題設為大標題,接著點擊tableViewController上的NavigationItem,修改其標題為探索。
接著點擊TableView的介面,打開Attributesinspector介面將content參數修改為StaticCells,同時將Section參數修改為3。
我們要使用靜態的cell來完成任務,第一步就是在第一個section裏面完成集合視圖的描繪。
打開第一個TableViewCell的Sizeinspector,將RowHeight修改為230。
不要忘記給你的TableView故事面板添加類別。
我這邊用的是TableViewController.swift來進行TableViewController的操作。
2.給Cell添加View
接著從Library裏面拖出一個View控件,放在第一個Cell上面。
接著給View控件添加新的約束。
3.給Cell添加CollectionView
接著,從Library裏面拖出CollectionView控件,將它放在View上面。
像剛剛View一樣設置相同的約束即可,同時我們要將集合視圖的滾動方向修改為水平方向。
在Attributesinspector裏面找到ScrollDirection,將它修改為Horizontal。
接著在Sizeinspector裏面將Cellsize修改為Width:290,height:185。
在Sectioninsets裏面修改Left為15,right為15。
最重要的一步:點擊Cell,打開Attributesinspector,找到CollectionReusableView,在Identifier後面寫上Cell。
4.添加照片控件
在Library裏面找到imageView,將它拖到CollectionCell上面,設置它的約束。
5.添加類別標簽與主副標題標簽
我們先來添加類別標簽。
從library裏面拖出來一個Label,將它拖到imageView上面,修改Label的字體和顏色等相關參數,參考示例圖片。
同樣的,給它添加一些約束。
此時要注意:我們為了保證label可以隨著我們寫的字數而有彈性變化,就需要修改它距離Cell最右側的距離,我們將它修改為小於等於。
接著是我們的主副標題。
拖動兩個label到imageView的左下角,將每一個label的顏色修改為白色,同時也根據你的想法修改字體。
當然,你也可以參考我的。
接著,我們來考慮一個小細節。
如果某一個collectioncell它沒有副標題,那麽在iPhone上面展示的時候,副標題那一欄是沒有字的,只有主標題有字。
在美觀方面,沒有副標題的那一個Cell,它的主標題離cell的最下方比較遠,這樣並不適合。
我們希望在沒有副標題的時候,主標題可以適當地下移幾公分,這樣會顯得比較好看。
如圖可以看出不同之處。
為了實現第二張圖片的功能,我們可以使用StackView來完成。
按住command按鈕,選擇主標題label和副標題label,選擇embedin->StackView。
選中我們的StackView,打開Attributesinspector->View->ContentMode->ScaleToFill。
同時將Spacing修改為1。
接著我們給它添加約束,只需要添加兩個約束就可以了,位置你可以自己選擇。
到此,我們CollectionView的介面制作就完成了。
此時你的storyboard裏面第一個section的介面應該和我的一樣。
展示集合視圖的數據
下面我們來使用代碼實現集合視圖。
要想實現展示數據的功能,我們需要數據源,其中所使用的圖片,你可以從Unsplash裏面找到。
1.創建集合視圖數據源
新建一個Swift文件(command+N即可),選擇SwiftFile,點擊Next,給它命名為imageCollection。
打開你剛剛創建的imageCollection.swift文件,往裏面添加一個結構體。
importUIKit
structimageViewCollection{
varimage:UIImage?
vartitle:String=""
vargeneral:String=""
varsubTitle:String=""
}
接著,在你的TableViewController.swift文件裏面寫上你的數據源:
/**
*第一部分
*在tableViewCell裏面添加了一個collectionView,實現了4個collectionCell
*每一個cell裏面有一個標題,副標題,背景圖片以及分類標簽
*/
privatevarimages=[imageViewCollection(image:UIImage(named:"1"),title:"狗來了",general:"精選集",subTitle:""),imageViewCollection(image:UIImage(named:"2"),title:"芒果街上的小屋",general:"晨讀",subTitle:"優美純凈的小書"),imageViewCollection(image:UIImage(named:"4"),title:"吹小號的天鵝",general:"睡前故事",subTitle:""),imageViewCollection(image:UIImage(named:"3"),title:"時代廣場的蟋蟀",general:"下午茶",subTitle:"生命之間愛和關懷的故事")]
為了實現展示的功能,你還需要給你的TableViewController添加上collection的父類:UICollectionViewDelegate和UICollectionViewDataSource。
classTableViewController:UITableViewController,UICollectionViewDelegate,UICollectionViewDataSource{
········
}
2.添加imageViewController.swift文件
新建一個swift文件,File->New->File(或者command+N),選擇CocoaTouchClass,
點擊Next,選擇以UITableViewCell為父類,新建類的名字為imageViewControllerTableViewCell。
打開剛剛創建的imageViewControllerTableViewCell.swift文件,在裏面寫上幾個變量:
@IBOutletweakvarimageView:UIImageView!//背景照片
@IBOutletweakvargeneralLabel:UILabel!//類別標簽
@IBOutletweakvartitleLabel:UILabel!//主標題
@IBOutletweakvarsubTitleLabel:UILabel!//副標題
同時打開我們的Main.storyboard和imageViewControllerTableViewCell.swift文件,按住control,將上述聲明的變量和故事面板裏的控件一一連線。
3.展示我們的數據
我們還需要告訴iPhone我們要展示多少個集合,對此,我們在TableViewController裏面添加上:
funccollectionView(_collectionView:UICollectionView,numberOfItemsInSectionsection:Int)->Int{
returnimages.count
}
funcnumberOfSections(incollectionView:UICollectionView)->Int{
return1
}
接著,在TableViewController.swift文件裏面聲明一個collectionView變量:
@IBOutletweakvarcollectionView:UICollectionView!{
didSet{
collectionView.backgroundColor=.clear
}
}
和剛剛的操作一樣,將這個變量和故事面板裏的CollectionView連線。
為了實現展示數據的功能,我們可以像tableView那樣來做,在類方法collectionView(:cellForItemAt:)裏面進行操作:
funccollectionView(_collectionView:UICollectionView,cellForItemAtindexPath:IndexPath)->UICollectionViewCell{
letcell=collectionView.dequeueReusableCell(withReuseIdentifier:"Cell",for:indexPath)as!imageViewCollectionViewCell
cell.imageView.image=images[indexPath.row].image
cell.generalLabel.text=images[indexPath.row].general
cell.titleLabel.text=images[indexPath.row].title
cell.subTitleLabel.text=images[indexPath.row].subTitle
ifimages[indexPath.row].subTitle==""{
cell.subTitleLabel.isHidden=true
//cell.subTitleLabel.text=""//這樣就可以看到美觀感
}
cell.layer.cornerRadius=10.0
cell.layer.masksToBounds=true
returncell
}
如果你現在去運行的話,你不會看到數據,我們還需要指定數據源在哪裏。
在viewDidLoad()裏面加上兩句話:
overridefuncviewDidLoad(){
super.viewDidLoad()
collectionView.delegate=self
collectionView.dataSource=self
}
此時,你再去運行,你會發現collectionView可以工作了。
添加表格視圖
第二部分和第三部分其實思路是一樣的,都是為了達到staticcell與dynamiccell混合使用的目的。
1.storyboard準備工作
打開我們的故事面板,點擊一開始創建三個Section裏的第二個section,將它的高度修改為120,然後,給第二組的空白Cell設置identifier值,如圖,我將它設為TableViewCell:
同樣的,給第三個section寫一個Header,將它命名為瀏覽精選集,將它的高度修改為60,給第三組的空白Cell設置identifier值,我將它設置為FeaturedCell:
2.創建第二部分的Xib文件
由於第二組和第三組的section需要自定義cell,使用這裏使用XIB來完成。
我們先來自定義第二組的Cell,使用command+N快捷鍵,創建一個TableViewCell文件,我將它命名為TableViewCell.swift,注意要勾選AlsoCreateXIBfile:
打開storyboard,點擊第二個section的Cell,在右側打開identityinspector,將它的繼承類修改為剛剛創建的TableViewCell。
現在,我們來分析看看需要給Cell自定義哪一些控件。
如圖所示:
打開我們的Xib文件,它的操作其實和Storyboard一樣,你只需要在Library裏面將需要的控件拉到xib文件裏面就可以了。
佈局的相關知識我就不再囉嗦了,只要佈局和我的差不多就可以:
3.添加控件代碼
接著,打開xib文件對應的TableViewCell文件,我們的是TableViewCell.swift文件。
和上述一些步驟一樣,先在裏面聲明一些變量:
@IBOutletweakvarclassLabel:UILabel!//類別標簽
@IBOutletweakvartitleLabel:UILabel!//主標題
@IBOutletweakvarsubTitle:UILabel!//副標題
@IBOutletweakvarbackgroundImage:UIImageView!{
didSet{
backgroundImage.layer.cornerRadius=15.0//設置圓角大小
backgroundImage.layer.masksToBounds=true
}
}//配對圖片
再將它們和xib裏面的控件一一連線即可。
接著我們需要在storyboard裏面使用這個控件,打開storyboard對應的TableViewController.swift文件,在裏面註冊一下NIB,如下:
//第二組需要自定義cell,這裏使用XIB來完成
letnib=UINib(nibName:"TableViewCell",bundle:nil)
在你的ViewDidLoad()裏面添加上代碼:
//需要用代碼註冊Nib
self.tableView.register(nib,forCellReuseIdentifier:"TableViewCell")
這樣子,第二部分的佈局就差不多結束了。
4.創建第三部分的xib文件
第三部分和第二部分差不多,創建方式一模一樣,只是控件的佈局不一樣。
新建一個TableViewCell文件,我將它命名為FeaturedTableViewCell,勾選創建Xib文件的選項。
像第二個Section一樣,我們對它進行佈局等一系列操作:
編寫好控件的代碼:
在TableViewController.swift裏面註冊一下nib:
//第二組需要自定義cell,這裏使用XIB來完成
letnib=UINib(nibName:"BookTableViewCell",bundle:nil)
//第3組也需要自定義cell,這裏使用XIB來完成
letfeaturedNib=UINib(nibName:"FeaturedTableViewCell",bundle:nil)
overridefuncviewDidLoad(){
super.viewDidLoad()
//必須帶上這兩句話才有數據
collectionView.delegate=self
collectionView.dataSource=self
//需要用代碼註冊Nib
self.tableView.register(nib,forCellReuseIdentifier:"TableViewCell")
self.tableView.register(featuredNib,forCellReuseIdentifier:"FeaturedCell")
}
非常好,我們快要接近成功了,你已經完成了3/4的工作了,我們還需要實現TableView的代理,這個可以實現staticcell與dynamiccell混合使用。
展示表格視圖
這一部分是整篇文章的最後一部分,我們用代碼形式來完成數據展示的任務。
1.創建數據源
我們先來創建第二個section的數據源,在TableViewController.swift文件裏面添上:
/**
*這裏是第二部分
*我想要在CollectionView下方展示一系列書籍,使用TableViewCell來顯示
*想要在靜態的cell裏面實現動態的cell需要使用xib文件
*/
//這是我將要在tableViewCell裏面展示給大家的內容
privatevarbooks=[Book(classText:"友誼",title:"塔克的郊外",subTitle:"一只蟋蟀、一只老鼠和一只貓咪的\n童話連續劇。
",image:UIImage(named:"5")),Book(classText:"青春",title:"會飛的教室",subTitle:"一部由孩子們自編自演的聖誕情景劇,\n一部濃縮的校園風景錄。
",image:UIImage(named:"6")),Book(classText:"浪漫",title:"銀河鐵道之夜",subTitle:"一部未完成的作品\n銀河深處,便是那幸福的天堂嗎?",image:UIImage(named:"7")),Book(classText:"生命",title:"夏洛的網",subTitle:"世界上有兩種人,一種人讀過\n《夏洛的網》,另一種人正準備讀。
",image:UIImage(named:"8")),Book(classText:"冒險",title:"柳林風聲",subTitle:"一個適合坐在火爐邊,大家一起聽的\n故事。
",image:UIImage(named:"9"))]
接著是第三個section的數據源:
/**
*這是第三部分
*在這一部分要實現簡單的tableViewCell功能
*每一個cell由一張圖片,一個標題構成
*/
privatevarfeaturedBooks=[Featured(image:UIImage(named:"10"),title:"小王子"),Featured(image:UIImage(named:"11"),title:"愛德華的奇妙之旅"),Featured(image:UIImage(named:"12"),title:"窗邊的小豆豆"),Featured(image:UIImage(named:"13"),title:"夢書之城"),Featured(image:UIImage(named:"14"),title:"天藍色的彼岸"),Featured(image:UIImage(named:"15"),title:"看得見風的男孩")]
2.完善表格視圖
有了數據源以後,我們就要開始將它們寫入tableViewCell裏面了。
說實話,操作和普通的tableViewCell操作一模一樣,我們只是多了一個註冊nib的環節。
//以下代理方法必須實現
overridefunctableView(_tableView:UITableView,cellForRowAtindexPath:IndexPath)->UITableViewCell{
if(indexPath.section==1){
letcell=tableView.dequeueReusableCell(withIdentifier:"TableViewCell")as?TableViewCell
cell?.classLabel.text=books[indexPath.row].classText
cell?.titleLabel.text=books[indexPath.row].title
cell?.subTitle.text=books[indexPath.row].subTitle
cell?.backgroundImage.image=books[indexPath.row].image
returncell!
}
ifindexPath.section==2{
letcell=tableView.dequeueReusableCell(withIdentifier:"FeaturedCell")as?FeaturedTableViewCell
cell?.bookImage.image=featuredBooks[indexPath.row].image
cell?.bookTitle.text=featuredBooks[indexPath.row].title
returncell!
}
returnsuper.tableView(tableView,cellForRowAt:indexPath)
}
overridefunctableView(_tableView:UITableView,numberOfRowsInSectionsection:Int)->Int{
ifsection==1{
returnbooks.count//這裏返回第二組的行數
}
ifsection==2{
returnfeaturedBooks.count
}
returnsuper.tableView(tableView,numberOfRowsInSection:section)
}
overridefunctableView(_tableView:UITableView,indentationLevelForRowAtindexPath:IndexPath)->Int{
ifindexPath.section==1{
returnsuper.tableView(tableView,indentationLevelForRowAt:IndexPath(row:0,section:1))
}
ifindexPath.section==2{
returnsuper.tableView(tableView,indentationLevelForRowAt:IndexPath(row:0,section:2))
}
returnsuper.tableView(tableView,indentationLevelForRowAt:indexPath)
}
overridefunctableView(_tableView:UITableView,heightForRowAtindexPath:IndexPath)->CGFloat{
ifindexPath.section==1{
return120
}
ifindexPath.section==2{
return80
}
returnsuper.tableView(tableView,heightForRowAt:indexPath)
}
我不解釋類方法的含義,這個你可以從AppCoda上的SwiftBook找到你要的知識點。
讓我解釋一下那幾個判斷語句:由於我們一共有三個section,每一個section對應的控件不同,就需要有一定的判斷功能,注意section是從0開始數的。
後記
這是比較簡單的模型,你可以發揮自己的想像力創造更多好看的介面。
謝謝閱讀我的文章。
本篇為在校大學生黃潤華先生的客座投稿,他主要使用Swift進行開發,有時使用C或者C++挑戰一些算法題目。
作者
AppCoda編輯團隊
此文章為客座或轉載文章,由作者授權刊登,AppCoda編輯團隊編輯。
有關文章詳情,請參考文首或文末的簡介。
查看全部文章
評論
載入評論
精選文章
在SwiftUI使用Markdown輕鬆格式化文本
30Mar2022
透過SwiftPlaygrounds4直接在iPad構建一個文字轉語音App
12Jan2022
在SwiftUI中設置漸變動畫(animatedgradient)的3個方法
29Sep2021
最新文章
在SwiftUI利用LiveTextAPI 從圖片中擷取文本
29Jun2022
善用Swift的嵌套物件功能 編寫出更清晰的程式碼
22Jun2022
WWDC22的重點更新:SwiftUI4.0新功能一覽
14Jun2022
很好!你已成功註冊。
歡迎回來!你已成功登入。
你已成功訂閱AppCoda中文版電子報。
你的連結已失效。
成功!請檢查你的電子郵件以獲取用於登入的連結。
好!你的付費資料已更新。
你的付費方式並未更新。
延伸文章資訊
- 1User interface design,UI - 使用者介面設計|教學網站
如果你對於使用APP和逛網站很有心得,覺得很多APP很難用,很多網站找不到想找的資訊。 設計不便利,視覺不美觀,對於開發或改善新的APP很有想法,歡迎你來到使用者介面 ...
- 2UI/UX|第一次設計App:寫給菜逼的新手指南 - Medium
設計人生第一個App 之前,我做足了功課。我惡補了iOS 的Human Interface Guidelines(HIG)和Material Design Guidelines,看了各種設計思考...
- 3UI 介面設計入門,輕鬆上手Sketch! - 線上教學課程 - Hahow
這堂UI 入門課程將帶你學習主流UI 設計軟體Sketch,並掌握如何設計與改善使用者介面, ... 單元1 - 案例練習-1 / iOS App介面設計- part1.
- 4給APP介面設計新手的詳解秘笈 - 探索課程
最後限時3 天加入課程. 只要點選0元立即參與,將能領取限時專屬課程. 將會由學習的諮詢老師與您聯繫做討論. 介面設計(UI/UX)是整合「設計、技術、行銷、商業模式」等 ...
- 5APP 介面設計工作流程
其實在這篇APP的流程規劃前,我也是在網路上找了非常多的範例跟教學,但很少是從一 ... 有了wireframe後,接著就是開始進行UI設計了,因為本身有官網,所以設計風格 ...