本文主要記錄了本人在使用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è)置為任意尺寸的

這樣可以直接把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é)view的背景顏色即可(默認(rèn)default為黑?)

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

對(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ì)遮掉圓角。

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

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


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

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


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

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

設(shè)置好高度不然內(nèi)容顯示不全
Collectionview
實(shí)現(xiàn)一個(gè)可以橫向滑動(dòng)的Collectionview。
build時(shí),item必須是1。

設(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

可以使用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)行修改

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

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

Searchbar

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


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

約束設(shè)置

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


導(dǎo)航

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


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

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

