iOS UI設(shè)計(jì)實(shí)戰(zhàn)

本文主要記錄了本人在使用Storyboard時(shí)遇到的一些問(wèn)題以及解決方案,主要涉及到ScrollView,TableView,CollectionView,導(dǎo)航欄,動(dòng)態(tài)變化,適配等問(wèn)題。

我們的目標(biāo),完成設(shè)計(jì)師所提供的UI設(shè)計(jì)


最終效果

Scorllview

要下滑的 ,為了更方便的查看整個(gè)view
可以把控制器設(shè)置為任意尺寸的

Freeform

這樣可以直接把scrollview里的東西放進(jìn)去
要scrollview(設(shè)置好四邊的約束) 然后再在里面設(shè)置一個(gè)view (設(shè)置好約束)根據(jù)滑動(dòng)方向,設(shè)置x對(duì)齊或者y對(duì)齊(不設(shè)置就可以隨便動(dòng)),然后設(shè)置好contentsize??! 比如用一個(gè)高度約束(下滑) 才可以使用 必須要確定contentsize。背景顏色也是由contentview決定的
加入scrollview的組件(看關(guān)系)才能被滑動(dòng),否則是固定的!

Gallery所在的view沒(méi)有加入scrollview中,所以可以保持不動(dòng),然后再提供一個(gè)透明度,即可實(shí)現(xiàn)下圖的效果


效果

設(shè)置透明度之后狀態(tài)欄效果


調(diào)節(jié)前

調(diào)節(jié)view的背景顏色即可(默認(rèn)default為黑?)


調(diào)節(jié)后

圓角陰影設(shè)置

myChart.layer.masksToBounds = false
myChart.layer.cornerRadius = 10
myChart.layer.shadowColor = UIColor.black.cgColor
myChart.layer.shadowOpacity = 0.8
myChart.layer.shadowOffset = CGSize(width: 0, height: 3)
并沒(méi)有圓角

這是沒(méi)有圓角的!
masksToBounds必須設(shè)為false 否則沒(méi)有陰影 (默認(rèn)就是false)
masksToBounds:是類(lèi)CALayer的屬性,如果設(shè)置為yes,則其子view不顯示超出父View layer的部分,因此,對(duì)于imageview圓角和陰影不能兼得。(需要外加shadowview)


對(duì)整個(gè)view設(shè)置陰影圓角

對(duì)包含label和imageview的整個(gè)視圖設(shè)置陰影時(shí),其子視圖都會(huì)有陰影。所以要在這個(gè)view里再放一個(gè)shadowview和子控件并列,如果把testView.layer.masksToBounds = true并把外面的view設(shè)置圓角。

目前效果

但這樣陰影也無(wú)法顯示,因?yàn)殛幱耙彩谴嬖趫D層之外的(masksToBounds = true會(huì)導(dǎo)致無(wú)法顯示陰影)

于是考慮masksToBounds = false然后對(duì)里面的imageview加圓角


目前效果

所以考慮對(duì)圖片進(jìn)行單獨(dú)設(shè)置圓角(上面兩個(gè)角)

//設(shè)置左上和右上圓角 ios11+
myChart.layer.cornerRadius = 10
myChart.layer.masksToBounds = true
myChart.layer.maskedCorners = [CACornerMask.layerMinXMinYCorner , CACornerMask.layerMaxXMinYCorner]
完成

為什么圓角和陰影一起的時(shí)候設(shè)置為false圓角還能顯示?單獨(dú)圓角的時(shí)候不是要true才能保證圓角的顯示嗎
imageView要設(shè)置圓角必須設(shè)置true,而普通的view、button等是可以不設(shè)置的 true false都可以顯示圓角。陰影和圓角都可以單獨(dú)設(shè)置,但是不能一起因?yàn)橐粋€(gè)true一個(gè)false。
可以理解為 imageview 外面是一個(gè)view 里面是一個(gè)image,false的話(huà) 圖肯定會(huì)遮掉圓角。


測(cè)試

因此imageview涉及到陰影的地方,可以外加一個(gè)shadowview來(lái)做。

Tableview

設(shè)置好的效果

注意自定義的cell需要設(shè)置給cell而不是view


cell
消除分割線(xiàn)

要有shadow的話(huà)要注意,shadow不能太大 ,如果和cell一樣大 ,那都看不見(jiàn)效果了。

最終效果

靜態(tài)tablevie:一定要在tableviewcontroller里才能用,否則會(huì)報(bào)錯(cuò)


靜態(tài)tableView
靜態(tài)cell

陰影直接加在tableview上,加在cell上容易導(dǎo)致cell的陰影互相影響。

dataSource和delegate

view中的tableview要設(shè)置這個(gè),直接拉線(xiàn)到這個(gè)vc就行。

設(shè)置高度

設(shè)置好高度不然內(nèi)容顯示不全

Collectionview

實(shí)現(xiàn)一個(gè)可以橫向滑動(dòng)的Collectionview。
build時(shí),item必須是1。


item設(shè)置

設(shè)置item可以方便你調(diào)試tableview的大小


效果

注意scroll和tableview一起用的時(shí)候要注意,scroll的containview的大小要和tableview底邊界一樣,不然會(huì)有留白的地方
direction控制滾動(dòng)的方向!

設(shè)置代理
重用cell
注意,collection數(shù)據(jù)量過(guò)少可能會(huì)導(dǎo)致不能滑動(dòng)!
(后來(lái)發(fā)現(xiàn)是由于collectionview設(shè)置的太長(zhǎng)了 其實(shí)只要和屏幕一樣大小就可以了 數(shù)據(jù)量沒(méi)有超過(guò)collectionview的話(huà)是不能滑動(dòng)的)
另外 storyboard更改 在真機(jī)上是不能看見(jiàn)改變的 模擬器可以(好像是中文漢化的問(wèn)題)

collectionview要實(shí)現(xiàn)的函數(shù)
func collectionView(_ collectionView:UICollectionView, numberOfItemsInSection section: Int)->Int{}
func collectionView(_ collectionView:UICollectionView, cellForItemAt indexPath: IndexPath)->UICollectionViewCell{}
不同設(shè)備使用發(fā)現(xiàn)cell的寬度由于是sb中設(shè)置的,是無(wú)法改變的,任何設(shè)備都一樣,所以導(dǎo)致效果不好,于是想更改適配,發(fā)現(xiàn)這個(gè)width是get-only

無(wú)法更改width

可以使用flowlayout進(jìn)行重新布局,針對(duì)不同設(shè)備進(jìn)行選擇

//重新布局一下 可以改變cell的寬度 否則適配很有問(wèn)題
flowLayout = UICollectionViewFlowLayout()
flowLayout.itemSize = CGSize(width: screenwidth - 30 , height: 256)
flowLayout.scrollDirection = .horizontal
collectionView.setCollectionViewLayout(flowLayout, animated: true)

日期處理

根據(jù)當(dāng)前時(shí)間和存儲(chǔ)的時(shí)間,顯示Today Yesterday xx days ago或者具體日期

//處理時(shí)間 "2018-06-08-18:05"
        var splitedArray0 = data.mydate.components(separatedBy: "-")
        let year = Int(splitedArray0[0])!
        let month = Int(splitedArray0[1])!
        let day = Int(splitedArray0[2])!
        let time = splitedArray0[3]
        //獲取當(dāng)前時(shí)間
        let calendar = Calendar.current
        let date = Date()
        let dateComponents = calendar.dateComponents([.year,.month, .day, .hour,.minute,.second], from: date)
Calendar.current和dateComponents

進(jìn)行分割然后對(duì)比

設(shè)置可以動(dòng)態(tài)變化的View

想設(shè)置根據(jù)數(shù)值變化的矩形,首先在IB里要提供足夠的約束 不然可能默認(rèn)位置無(wú)法確認(rèn)導(dǎo)致無(wú)法顯示。


效果

發(fā)現(xiàn)更改frame的size沒(méi)有用,然后發(fā)現(xiàn)可以把約束給拖進(jìn)去,然后約束有一個(gè)constant值,可以直接進(jìn)行修改


修改約束constant值
ios9 以前獲取高度和寬度
let screenh = UIScreen.mainScreen().applicationFrame.size.height
let screenw = UIScreen.mainScreen().applicationFrame.size.width
ios9 以后獲取高度和寬度
let screenh = UIScreen.main.bounds.size.height
let screenw = UIScreen.main.bounds.size.width
根據(jù)數(shù)據(jù)計(jì)算長(zhǎng)度

CGFloat不能和Float進(jìn)行乘法,要轉(zhuǎn)換為CGFloat,非單純數(shù)值的需要進(jìn)行轉(zhuǎn)換然后比較。

最終效果:


效果

Searchbar

樣式

設(shè)置searchbar的樣式為Minimal則實(shí)際沒(méi)有邊框線(xiàn)(不顯示背景)


效果

設(shè)置placehold

Placeholder效果,直接設(shè)置text的話(huà)相當(dāng)于提前輸入進(jìn)去


效果

約束設(shè)置

向右約束結(jié)果

最好往左約束,如果往右約束,那么如果變成三位數(shù),一位數(shù),結(jié)果的起始位置都是不一樣的,所以要從左約束


向左約束

修改結(jié)果

導(dǎo)航

大標(biāo)題

導(dǎo)航欄大標(biāo)題,會(huì)使導(dǎo)航欄變厚


大標(biāo)題設(shè)置

效果

右邊沒(méi)設(shè)置detail的時(shí)候會(huì)覺(jué)得很奇怪 因?yàn)镈etail那行還是在的

傳遞數(shù)據(jù)

segue中傳遞數(shù)據(jù),這時(shí)候直接訪(fǎng)問(wèn)timeLabel會(huì)是nil,會(huì)崩潰,所以還是要通過(guò)自定一個(gè)屬性來(lái)傳

最終效果

效果

效果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,246評(píng)論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,665評(píng)論 1 32
  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,208評(píng)論 3 119
  • 讀書(shū)打卡第4天 《十幾歲孩子的正面管教》第一章《怎樣知道你的孩子進(jìn)入了青春期》第14到18頁(yè)今天讀了第一章的最后3...
    小羊肖恩楊閱讀 107評(píng)論 0 0
  • 今天是感恩的一天。 1 晨間起來(lái),老公已出門(mén)。來(lái)到陽(yáng)臺(tái),看到晾曬的衣服還在滴水,瞬間被幸福包圍。何時(shí)他已出門(mén)我不得...
    琴素親子閱讀 365評(píng)論 3 4

友情鏈接更多精彩內(nèi)容