iOS bounds學(xué)習(xí)筆記以及仿寫UIScrollView部分功能詳解
經(jīng)??吹竭@種說法,frame是基于父控件的,bounds是基于自身坐標(biāo)的。然而,這個(gè)自身坐標(biāo)是什么?bounds這個(gè)屬性存在的意義是什么呢?bounds的x和y值真的永遠(yuǎn)是0嗎?
經(jīng)過查閱資料,我看到這樣一種說法:一個(gè)控件,擁有其展示部分和內(nèi)容部分。其展示部分是有限大的,固定坐標(biāo)固定大小,而其內(nèi)容部分是無限大的。就像一個(gè)電視機(jī)以及其播放的電影(這個(gè)比喻不太恰當(dāng),是我強(qiáng)行比喻的),電視機(jī)用于放映電影的屏幕(控件的展示部分)是固定位置固定大小的,然而電影的世界(控件的內(nèi)容部分)是無限大的,我們只能展示這個(gè)無限的內(nèi)容的有限部分。
Demo演示bounds
先展示下效果圖
我設(shè)置了兩個(gè)view,一個(gè)是紅色的背景view,紅色view里嵌套了一個(gè)小的藍(lán)色的view。我給紅色view添加了點(diǎn)擊手勢,點(diǎn)擊紅色view,讓紅色view bounds.origin.y += 5;,并打印bounds的值。結(jié)果顯示,bounds的y值確實(shí)增加了,而實(shí)際效果是,藍(lán)色小色塊在不斷移動(dòng)。
其實(shí),frame設(shè)置的是其展示區(qū)域,就像電視機(jī)的顯示屏。而bounds設(shè)置的是其內(nèi)容區(qū)域,就像電視機(jī)放映的電影中那個(gè)廣闊的世界一樣。對于這部分的理解,我想結(jié)合scrollView會(huì)更容易些。scrollView的frame設(shè)置的僅僅只是scrollView的展示界面,而其滑動(dòng)區(qū)域需要設(shè)置contentSize屬性。
- (void)viewDidLoad { [super viewDidLoad]; // 紅色的背景view UIView *view = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)]; view.backgroundColor = [UIColor redColor]; [self.view addSubview:view]; // 單擊手勢 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewClick:)]; [tap setNumberOfTouchesRequired:1]; [view addGestureRecognizer:tap]; // 藍(lán)色的子view UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 190, 10, 10)]; subView.backgroundColor = [UIColor blueColor]; [view addSubview:subView]; } - (void)viewClick:(UITapGestureRecognizer *)gesture { // 獲取紅色view UIView *view = gesture.view; // 修改bounds的值 CGRect bounds = view.bounds; bounds.origin.y += 5; view.bounds = bounds; // 展示bounds的值 NSLog(@"bounds:%@",NSStringFromCGRect(view.bounds)); }
關(guān)于修改bounds后,其內(nèi)容的移動(dòng)規(guī)律,我是這樣理解的。我們都知道,左上角是(0,0),右下角方向移動(dòng),x和y都是增加的。而對于bounds,由于一個(gè)控件的展示部分被frame固定了,不可以隨意移動(dòng)。而在上面的例子中,y是自增的,那么控件應(yīng)該相對于內(nèi)容部分向下移動(dòng)才對(設(shè)置frame是相對于父控件移動(dòng),那么設(shè)置bounds就是針對自身的內(nèi)容區(qū)域移動(dòng))。而控件是不能移動(dòng)的,所以能移動(dòng)的就是內(nèi)容區(qū)域了。內(nèi)容區(qū)域相對控件向相反的方向移動(dòng),也就是向上移動(dòng)了。
仿寫UIScrollView的部分效果
仿寫思路:scrollView的滑動(dòng)效果,我們可以通過添加滑動(dòng)手勢實(shí)現(xiàn)。scrollView的內(nèi)容滾動(dòng),我們可以通過修改scrollView的bounds來實(shí)現(xiàn)。
效果圖
代碼
- (void)viewDidLoad { [super viewDidLoad]; // 仿scrollView UIView *myScrollView = [[UIView alloc] initWithFrame:self.view.bounds]; myScrollView.backgroundColor = [UIColor redColor]; [self.view addSubview:myScrollView]; // 滑動(dòng)手勢 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGes:)]; [myScrollView addGestureRecognizer:pan]; // scrollView的內(nèi)容 UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 10, 10)]; blueView.backgroundColor = [UIColor blueColor]; [myScrollView addSubview:blueView]; } - (void)panGes:(UIPanGestureRecognizer *)gesture { UIView *myScrollView = gesture.view; // 獲取滑動(dòng)的位移量 CGPoint transPoint = [gesture translationInView:myScrollView]; NSLog(@"%@",NSStringFromCGPoint(transPoint)); // 這里總感覺寫錯(cuò)了,我腦子笨,有點(diǎn)繞不過來了。頭疼 CGRect bounds = myScrollView.bounds; bounds.origin.x -= transPoint.x; bounds.origin.y -= transPoint.y; myScrollView.bounds = bounds; // 復(fù)位 [gesture setTranslation:CGPointZero inView:myScrollView]; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
iOS?項(xiàng)目嵌入Flutter?運(yùn)行(最新推薦)
這篇文章主要介紹了iOS?項(xiàng)目嵌入Flutter?運(yùn)行,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03簡單講解iOS應(yīng)用開發(fā)中的MD5加密的相關(guān)使用
這篇文章主要介紹了iOS應(yīng)用開發(fā)中的MD5加密的相關(guān)使用,示例代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-12-12IOS 使用NSAssert()和NSParameterAssert調(diào)試程序
這篇文章主要介紹了IOS 使用NSAssert()和NSParameterAssert調(diào)試程序的相關(guān)資料,需要的朋友可以參考下2017-06-06iOS中應(yīng)用內(nèi)添加指紋識(shí)別的實(shí)例代碼
iOS8之后蘋果發(fā)布了指紋識(shí)別的功能,通過touch ID來識(shí)別用戶,做用戶授權(quán),主要是依賴于LocalAuthentication庫,下面通過本文給大家介紹iOS中應(yīng)用內(nèi)添加指紋識(shí)別的實(shí)例代碼,一起看看吧2016-12-12WKWebview非全屏自動(dòng)播放h5視頻的實(shí)現(xiàn)方法(Swift、OC)
這篇文章主要給大家介紹了關(guān)于WKWebview非全屏自動(dòng)播放h5視頻的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05