ios UIScrollView原理

來源:互聯網
上載者:User

UIScrollView 原理

    在滾動過程當中,其實是在修改原點座標。當手指觸摸後, scroll view會暫時攔截觸摸事件,使用一個計時器。假如在計時器到點後沒有發生手指移動事件,那麼 scroll view 發送 tracking events 到被點擊的 subview。假如在計時器到點前發生了移動事件,那麼 scroll view 取消 tracking 自己發生滾動。

    子類可以重載

touchesShouldBegin:withEvent:inContentView: 決定自己是否接收 touch 事件
pagingEnabled:當值是 YES 會自動滾動到 subview 的邊界,預設是NO
touchesShouldCancelInContentView: 開始發送 tracking messages 訊息給 subview 的時候調用這個方法,決定是否發送 tracking messages 訊息到subview。假如返回 NO,發送。YES 則不發送。
假如 canCancelContentTouches屬性是NO,則不調用這個方法來影響如何處理滾動手勢。

    scroll view 還處理縮放和平移手勢,要實現縮放和平移,必須實現委託 viewForZoomingInScrollView:、scrollViewDidEndZooming:withView:atScale:
兩個方法。另外 maximumZoomScale和minimumZoomScale 兩個屬性要不一樣。

幾個屬性介紹

tracking
當 touch 後還沒有拖動的時候值是YES,否則NO

zoomBouncing
當內容放大到最大或者最小的時候值是 YES,否則 NO

zooming
當正在縮放的時候值是 YES,否則 NO

decelerating
當滾動後,手指放開但是還在繼續滾動中。這個時候是 YES,其它時候是 NO

decelerationRate
設定手指放開後的減速率

maximumZoomScale
一個浮點數,表示能放最大的倍數

minimumZoomScale 
一個浮點數,表示能縮最小的倍數

pagingEnabled
當值是 YES 會自動滾動到 subview 的邊界。預設是NO

scrollEnabled
決定是否可以滾動

delaysContentTouches
是個布爾值,當值是 YES 的時候,使用者觸碰開始,scroll view要延遲一會,看看是否使用者有意圖滾動。假如滾動了,那麼捕捉 touch-down 事件,否則就不捕捉。假如值是NO,當使用者觸碰, scroll view 會立即觸發 touchesShouldBegin:withEvent:inContentView:,預設是 YES

canCancelContentTouches
當值是 YES 的時候,使用者觸碰後,然後在一定時間內沒有移動,scrollView 發送 tracking events,然後使用者移動手指足夠長度觸發滾動事件,這個時候,scrollView 發送了 touchesCancelled:withEvent: 到 subview,然後 scroView 開始滾動。假如值是 NO,scrollView 發送 tracking events 後,就算使用者移動手指,scrollView 也不會滾動。

contentSize
裡面內容的大小,也就是可以滾動的大小,預設是0,沒有滾動效果。

showsHorizontalScrollIndicator
滾動時是否顯示水平捲軸

showsVerticalScrollIndicator
滾動時是否顯示垂直捲軸

bounces
預設是 yes,就是滾動超過邊界會反彈有反彈回來的效果。假如是 NO,那麼滾動到達邊界會立刻停止。

bouncesZoom
和 bounces 類似,區別在於:這個效果反映在縮放上面,假如縮放超過最大縮放,那麼會反彈效果;假如是 NO,則到達最大或者最小的時候立即停止。

directionalLockEnabled
預設是 NO,可以在垂直和水平方向同時運動。當值是 YES 時,假如一開始是垂直或者是水平運動,那麼接下來會鎖定另外一個方向的滾動。 假如一開始是對角方向滾動,則不會禁止某個方向

indicatorStyle
捲軸的樣式,基本只是設定顏色。總共3個顏色:預設、黑、白

scrollIndicatorInsets
設定捲軸的位置

scrollview裡面的view拖動的問題

請教一下各位一個問題:
我現在在一個scrollview上排列了很多view,這個scrollview是可以滾動的,我還想拖動view,但 是問題出現了,如果scrollview只能垂直滾動的話,橫向拖動view是沒問題的,但是豎向拖動view就會導致scrollview滾動,而本意 要移動的view卻不動了.scrollview不響應使用者觸摸的話,它自己就不能拖動了吧?我的目的是它也能動,但是其他view動的時候他不能動

解決了,在touchbegain中禁止scrollview滾動,然後在touchend中開啟scrollview滾動

 

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view;  
......

今天實驗了一次,scrollview預設就是這麼實現的,所以我不用自己重寫這個方法,
scrollview的工作原理是:當手指觸摸後, scroll view會暫時攔截觸摸事件,使用一個 計時器,假如在計時器到點後,沒有發生手指移動事件, 那麼,scroll
view發送tracking events到被點擊的subview, 假如在計時器到點前,發生了移動事件,那麼 scroll view 取消tracking 自己發生滾動. 
我最後的解決辦法很無語,在touchbegain中,禁止scrollview的滾動,在touchend中開啟scrollview的滾動

我的原始碼涉及到的東西比較多,不好剝離出來,我給你大概描述一下吧

//--------------初始化各個view--------------
UIScrollView *_scrollview = [[UIScrollView alloc] init];

//自訂的view,放到scrollview上
//其實正常的view就可以加到scrollview上,我之所以要自訂這麼一個中間view,是因為我要重寫touch的所有方法
//重寫touch方法的原因是,我要在touchBegain中讓scrollview的滾動失效,而在touchEnd中讓滾動有效
UIMyView *_myView=[[UIMyView alloc] init];

//需要拖動的view
UIView *_view = [[UIView alloc] init];

[_myView addSubview:_view];//將view加入自訂的view中,

[_scrollview addSubview:_myView];//將自訂view加入scrollview中
//-----------------------------------------------------

//-----------MyView中的方法,其他部分我就不寫了,只關注touch方法-------------------

....

#pragma mark --
#pragma mark touch
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
.....你自己的代碼......

UITouch *touch = [touches anyObject];

//如果是主view,則不進行操作
if ([touch view]==self) {
  return;
}

//由於中間隔了一層自訂的view,所以要兩次superview
UIScrollView *_scrollview = (UIScrollView *)[[[touch view] superview] superview];
_scrollview.scrollEnabled=NO;//讓scrollview停止回應滾動

.....你自己的代碼......
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
.....你自己的代碼...... 

UITouch *touch = [touches anyObject];

UIScrollView *_scrollview = (UIScrollView *)[[[touch view] superview] superview];
_scrollview.scrollEnabled=YES;//讓scrollview可以響應滾動

.....你自己的代碼...... 
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.