題目早早就定下了,現(xiàn)在想填充內容了,躊躇中卻不知道從哪里開始了。
窗外突然下起雨來。雖然不愿承認,但夏天確實已經(jīng)漸去漸遠,涼意開始蔓延。索性放空身心,伴著雨聲入眠吧。
I'm back!
眾所周知,UITableView的父視圖就是UIScrollView,UITableView之所以能滾動就是基于UIScrollView的特性,今天咱們就來深入理解一下UIScrollView。
上圖:

打碼:
- (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)了綠色視圖的滑動。
再上圖:

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


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的話,給兄弟一個吧,先謝過了。