當(dāng)前位置:
首頁 >
技术分享-bounds的深入认识
發(fā)布時(shí)間:2025/6/17
35
豆豆
生活随笔
收集整理的這篇文章主要介紹了
技术分享-bounds的深入认识
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?MAKE BY - LJW -------轉(zhuǎn)載請注明出處-------??
前言:初學(xué)者對bounds的認(rèn)識是以自己的左上角為坐標(biāo)原點(diǎn),而且x/y一般是0,0 但是對bounds深入認(rèn)識之后,我們應(yīng)該對它重新認(rèn)識 以下是對bounds的一些認(rèn)識: bounds: x/y一般為(0,0)默認(rèn)矩形框和內(nèi)容是重疊的,所以默認(rèn)是(0,0) 改變一個(gè)控件的bounds x/y對控件不會(huì)影響,對子控件有影響 修改父控件的bounds為(20,20)那么子控件會(huì)相對于父控件上移(20,20) 一個(gè)控件的認(rèn)識: 起碼是由兩大塊組成: 1.矩形框:控件的顯示位置和尺寸 2.內(nèi)容:控件內(nèi)部的東西,比如它的子控件 bounds:以控件自己內(nèi)容的左上角為坐標(biāo)原點(diǎn),計(jì)算出來的矩形框位置和尺寸 所以,bounds是包含位置和尺寸的. frame:以父控件內(nèi)容左上角為坐標(biāo)原點(diǎn),計(jì)算出來的矩形框位置和尺寸 控件本身的位置尺寸是由frame決定的,所以修改bounds,父控件的位置是不會(huì)變的 變得是內(nèi)容的位置.而子控件的位置會(huì)隨著內(nèi)容的位置而改變 而此時(shí),子控件發(fā)生了偏移,但是子控件的frame不會(huì)發(fā)生改變,因?yàn)樽涌丶膄rame是以父控件內(nèi)容左上角為坐標(biāo)原點(diǎn)得,內(nèi)容偏移了(30,30),但是子控件跟隨著也偏移了(30,30),相對于內(nèi)容還是(0,0) - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {CGRect bounds = self.redView.bounds;bounds.origin = CGPointMake(30, 30);self.redView.bounds = bounds;NSLog(@"%@", NSStringFromCGRect(self.s.frame)); } 實(shí)際應(yīng)用: scrollview:往下拽,那么子控件的bounds的Y是負(fù)數(shù),往上拽,內(nèi)容往上走,Y值會(huì)越來越大 往左拽,內(nèi)容往左邊走,那么相對于內(nèi)容左上角為原點(diǎn),X就是正數(shù),越來越大 此時(shí),bounds的尺寸是不變的,還是矩形框的寬高 bounds對contentOffset的影響: scrollview往上下左右拽,contentOffset也會(huì)發(fā)生變化,而且變化的值跟bounds是一樣的,代表內(nèi)容的偏移 scrollView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);?
bounds對contentInset的影響: 設(shè)置內(nèi)邊距為64,那么內(nèi)容x會(huì)使-64,因?yàn)閮?nèi)容往下偏移了. 所以修改內(nèi)邊距,可能會(huì)永久修改bounds的值,往下拽松手控件跟頂部永遠(yuǎn)會(huì)保留64的間距? 實(shí)際應(yīng)用: tableView的cell設(shè)置額外的偏移量 self.tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);scrollview同樣;? 驗(yàn)證: - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {NSLog(@"%@", NSStringFromCGPoint(tableView.bounds.origin)); }
打印一下結(jié)果:
所以,bounds的origin跟contentOffset的值是一樣的,而修改contentInset也會(huì)影響到這兩者.
?
?
當(dāng)一個(gè)控制器的scrollview套上一個(gè)導(dǎo)航控制器,那么scrollview里面的子控件會(huì)向下偏移64 就是說,處在導(dǎo)航控制器環(huán)境下,系統(tǒng)默認(rèn)會(huì)自動(dòng)調(diào)整距離頂部64的內(nèi)邊距, 那么bounds:-64 ?,偏移量也是-64 ? 是什么導(dǎo)致的呢? 隱藏導(dǎo)航條,那么距離頂部偏移量變成20,因?yàn)檫€有狀態(tài)欄的20. 這樣做是為了防止全屏使用scrollview時(shí)候擋住控件的顯示了,最明顯就是tableview的cell了 但是有多個(gè)scrollview情況下,只會(huì)調(diào)整一個(gè) 結(jié)論:哪個(gè)控件先添加,那么就調(diào)整誰. 但是很多情況是用不到的(一般用在tableview cell 比較常見).取消這種效果: 1.設(shè)置屬性 self.automaticallyAdjustsScrollViewInsets = NO;2.設(shè)置相應(yīng)的偏移量抵消
self.scrollView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);?官方文檔描述
?TabBarController對contentInset的影響:
如果scrollview被套上NavigationController和TabBarController,滾動(dòng)到最上面,系統(tǒng)會(huì)自動(dòng)下移64,滾到最下面,增加49.保證里面內(nèi)容都能看到
iOS7之后,蘋果做出了這樣的效果,并且是可以穿透的.?但是只有TabBarController就不會(huì)有自動(dòng)調(diào)整
打印結(jié)果:
總結(jié):
frame和bounds的重新認(rèn)識
- frame
- 以父控件?內(nèi)容的左上角為坐標(biāo)原點(diǎn), 計(jì)算出的控件自己?矩形框的位置和尺寸
- bounds
- 以控件自己?內(nèi)容的左上角為坐標(biāo)原點(diǎn), 計(jì)算出的控件自己?矩形框的位置和尺寸
- 概括
- frame.size == bounds.size
- scrollView.bounds.origin == scrollView.contentOffset
矩形框和內(nèi)容的理解
- 矩形框
- 控件自己的顯示位置和尺寸
- 內(nèi)容
- 控件內(nèi)部的東西,比如它的子控件
---恢復(fù)內(nèi)容結(jié)束---
轉(zhuǎn)載于:https://www.cnblogs.com/ljwiOS/p/5499227.html
總結(jié)
以上是生活随笔為你收集整理的技术分享-bounds的深入认识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMQ 3.6 安装
- 下一篇: python成长之路——第四天