鑒于自己工作原因恕出,已經(jīng)超過(guò)兩個(gè)月沒(méi)有再去寫(xiě) iOS 的東西了唉铜,鑒于今天朋友問(wèn)一些關(guān)于這方面的問(wèn)題筷屡,而且估計(jì)他后續(xù)還會(huì)沒(méi)完沒(méi)了--芜辕!所以在這里記錄下問(wèn)題尚骄,以便于某位人士自己過(guò)來(lái)看==!
灑家真的不想上班開(kāi)個(gè)遠(yuǎn)程給你看問(wèn)題==侵续!太糾結(jié)了倔丈。還不能語(yǔ)音。
后續(xù)的你問(wèn)我的問(wèn)題我會(huì)慢慢更新状蜗,你自己看吧--需五!加油==!
問(wèn)題1
在 appDelegate 里面這樣寫(xiě)诗舰,然后‘guide’上面有一個(gè) scrollview警儒,用于展示引導(dǎo)頁(yè)的幾張圖片
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
let guide = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Guide")
window?.rootViewController?.view.addSubview(guide.view)
return true
}
storyboard 里面的約束條件如下
實(shí)際效果為什么看不到scrollview呢
結(jié)果的效果圖如下
解釋
你會(huì)發(fā)現(xiàn)看view層級(jí)關(guān)系的時(shí)候選中的 scrollview 的高度為0
約束在 storyboard 上添加的。你會(huì)發(fā)現(xiàn)其中只有 bottom space to 不一樣眶根。其他均指向的是superview蜀铲,只有這個(gè)指向了 bottomLayoutGuide。
UIViewController有兩個(gè)屬性属百,如下
extension UIViewController {
// These objects may be used as layout items in the NSLayoutConstraint API
@available(iOS 7.0, *)
open var topLayoutGuide: UILayoutSupport { get }
@available(iOS 7.0, *)
open var bottomLayoutGuide: UILayoutSupport { get }
}
如果對(duì)這個(gè)兩個(gè)屬性不清楚的可以看這里
http://blog.kyleduo.com/2014/10/22/ios_learning_autolayout_toplayoutguide/
簡(jiǎn)單來(lái)說(shuō)這兩個(gè)屬性表示的是頁(yè)面所承載內(nèi)容的最上/最下顯示范圍记劝。這樣就不難理解上面的約束的含義了。他把底部和最下可見(jiàn)位置綁到一起了族扰。
而此時(shí)當(dāng)你在 appDelegate 里直接以 addSubview(_ view: UIView) 的方式把展示的內(nèi)容放上來(lái)的時(shí)候仔細(xì)看約束厌丑,
你會(huì)發(fā)現(xiàn)底部的約束沒(méi)有了。自然高度就沒(méi)有了渔呵。
那為什么約束會(huì)沒(méi)有呢怒竿?
看下圖:
會(huì)發(fā)現(xiàn) scrollView 的底部的約束實(shí)際存在的,指給了他自己所在的 controllerview. bottomLayoutGuide扩氢。但我們?cè)谇懊婵梢詤s看不到底部約束耕驰。
在這我嘗試的打印了window.rootViewController. bottomLayoutGuide,表示不知道怎么看了--录豺!
結(jié)論
原諒我的水平不行朦肘,結(jié)論是因?yàn)?addSubview 導(dǎo)致底部的那個(gè)約束丟失。
scrollView 其他的約束條件均是 scrollview 本身和其承載 view 的關(guān)系双饥,唯一底部約束是 scrollview 和承載 viewController 的關(guān)系媒抠。而通過(guò) addSubview 后。 scrollView 和實(shí)際顯示的承載viewController 也就是 window.rootController 沒(méi)有約束關(guān)系咏花。從而導(dǎo)致顯示有問(wèn)題趴生。
解決辦法
改約束條件==!變成其他實(shí)現(xiàn)方式就好了==!實(shí)測(cè)可以