回頭看UITableView(二)-父視圖UIScrollView

題目早早就定下了,現(xiàn)在想填充內容了,躊躇中卻不知道從哪里開始了。
窗外突然下起雨來。雖然不愿承認,但夏天確實已經(jīng)漸去漸遠,涼意開始蔓延。索性放空身心,伴著雨聲入眠吧。


I'm back!

眾所周知,UITableView的父視圖就是UIScrollView,UITableView之所以能滾動就是基于UIScrollView的特性,今天咱們就來深入理解一下UIScrollView。

上圖:


連續(xù)修改bounds屬性

打碼:

- (IBAction)boundsAction:(UIStepper *)sender {
    self.redView.bounds = CGRectMake(0, sender.value, self.redView.bounds.size.width,   self.redView.bounds.size.height);
    self.boundsLabel.text = [NSString stringWithFormat:@"紅色視圖bounds%@",NSStringFromCGRect(self.redView.bounds)];
}

我如果說改變bounds的值不用UIStepper實現(xiàn)而是用手勢實現(xiàn),不知道大家有沒有種恍然大悟的感覺。

我們再復習一下UIView的frame和bounds是什么。
. frame:當前view在父view坐標體系中的位置和大小
. bounds:當前view的坐標體系,容納子view的位置和大小
也就說一個view的位置是由當前view的frame和其父view的bounds決定的。

回到上面的紅綠視圖,你已經(jīng)看到:改變父view(紅色視圖)的bounds,子view(綠色視圖)的位置就會相應的改變。如果我們給紅色視圖加一個UIPangestureRecognizer(拖動手勢),滑動時根據(jù)其代理函數(shù)返回的值修改紅色視圖的bounds就實現(xiàn)了綠色視圖的滑動。

再上圖:


手勢修改bounds

再打碼:
- (IBAction)panHandler:(UIPanGestureRecognizer *)sender {
if(sender.state == UIGestureRecognizerStateChanged){
CGFloat distance = -[sender translationInView:sender.view].y;
self.redView.bounds = CGRectMake(0, self.redView.bounds.origin.y+distance, self.redView.bounds.size.width, self.redView.bounds.size.height);
[sender setTranslation:CGPointZero inView:sender.view];
}else if(sender.state == UIGestureRecognizerStateEnded){
self.boundsLabel.text = [NSString stringWithFormat:@"紅色視圖bounds%@",NSStringFromCGRect(self.redView.bounds)];
}
}

果然圖多可以少說話。那么你是不是可以自己手動寫個UIScrollView了,如果你敢回答不能我就敢一星期不吃肉。順便推薦一個錄屏軟件,個人感覺很好用,直接生成體積較小的gif。地址是http://www.cockos.com/licecap/

當然,對于這個能滑動的視圖的始祖,我們要想有強烈的掌控感,還需要了解幾個屬性。

  1. contentSize
    ?? 又要提到上圖了,好吧,如上圖,contentSize其實就是綠色視圖的大小,就是內容空間的大小。在UIScrollView里,當contentSize大于本身的frame.size的時候就可以滾動,否則不允許。
  2. contentOffset
    還是如上圖,contentOffset其實就是紅色視圖的bounds.origin,所以你是否明白為什么當contentOffset的值是正值的時候視圖往上,是負值的時候視圖往下了吧。
  3. contentInset
    這個屬性很難說清楚,所以,那就更應該說了。如果你設置了這個屬性后會對內容視圖做一個偏移操作,或者說給內容視圖添加了留白,比如說我們設置UIScrollView的contentInset為UIEdgeInsetsMake(64, 0, 0, 0)注意第一個參數(shù)是top,然后依次是left,bottom,right。那么添加的subview的位置縱坐標的起點就是subview.frame.origin.y+scrollView.contentInset.top(當然這是在不考慮父視圖的bounds的情況下)。你也許注意到了一點,我用了位置一詞,因為這其實是相對父視圖的位置,它的frame并沒有改變。
2DCEB800-BB02-4E2D-A58F-25C2247D2F21.png

啊哈哈,
self.scrollView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0);
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 50, self.scrollView.bounds.size.width, 200)];
view.backgroundColor = [UIColor greenColor];
[self.scrollView addSubview:view];

如圖,雖然view的起點是50,但是由于contentInset的原因,它相對于父視圖的縱坐標位置是100。

好了,先寫到這里,辦公室就我一個人了,兄弟我先回家了。

預告:根據(jù)上邊這些東東,咱們稍后談談怎么實現(xiàn)一個自定義的下拉刷新控件,我會盡快更新。
最后,誠心求一個Mac上方便作圖的軟件。如果你有破解版的sketch的話,給兄弟一個吧,先謝過了。

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

相關閱讀更多精彩內容

  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多,會對里面所有的內容的引用計數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,752評論 1 14
  • UIWindow 初始化: self.window= [[UIWindowalloc]initWithFrame:...
    Sunny_Fight閱讀 1,130評論 0 1
  • 記得女兒大四的時候,偶爾在網(wǎng)上看的女兒同學發(fā)的帖子,慶幸自己通過了專八考試,我想這時候還沒接到女兒報喜的消息,...
    hesiting閱讀 389評論 8 4
  • 今天,一位近40歲的從事幼師朋友突然告訴我,她想當培訓講師,具體哪個領域的講師,還沒確定,但唯一確定的是一線幼師的...
    蘭子伴你成長閱讀 3,497評論 2 21
  • 感賞自己越來越愛自己,越來越熱愛生活!感賞自己充滿能量…快遞給我優(yōu)惠13塊錢!感賞兒子乖乖的,感賞兒子給我禮物,給...
    我就是我hxh閱讀 186評論 0 1

友情鏈接更多精彩內容