一星瘾、UIScrollView簡(jiǎn)述:
作用:
UIScrollView可以讓一個(gè)大小超出展示范圍的UIView走孽,通過(guò)手指的拖動(dòng),展示出這個(gè)UIView的其他部分琳状,并且可以通過(guò)手勢(shì)磕瓷,對(duì)UIView進(jìn)行縮放
讀寫屬性
CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
CGFloat screenH = [UIScreen mainScreen].bounds.size.height;
UIScrollView *scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, screenW,screenH)];
//(CGSize類型):告訴UIScrollView所有內(nèi)容的尺?寸,也就是告訴 它滾動(dòng)的范圍(能滾多遠(yuǎn),滾到哪?里是盡頭)
scrollView.contentSize = CGSizeMake(screenW,screenH);
//(CGPoint類型):用來(lái)表?示UIScrollView滾動(dòng)的位置,(可以手動(dòng)設(shè)置)
scrollView.contentOffset = CGPointMake(100, 100);
//(UIEdgeInsets類型) 這個(gè)屬性能夠在UIScrollView的4周增加額外的滾動(dòng)區(qū)域
scrollView.contentInset = UIEdgeInsetsMake(0, 0, 20, 20);
//(BOOL類型): 彈簧效果
scrollView.bounces = NO;
//(BOOL類型): 是否可以滾動(dòng)
scrollView.scrollEnabled = NO;
//(BOOL類型): 橫向與縱向的滾動(dòng)條是否顯示
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
一些判斷
- 是否滑動(dòng)到了底部
//是否滑到了底部
BOOL isScrollBottom = self.scrollView.contentSize.height - self.scrollView.contentOffset.y <= self.scrollView.frame.size.height;
- 是否在手動(dòng)拖動(dòng)
在寫tableView的二級(jí)聯(lián)動(dòng)的時(shí)候可以用到念逞,這個(gè)是核心代碼
BOOL isTracking = scrollView.dragging && scrollView.tracking && !scrollView.decelerating;
其他屬性
scrollView.tracking;//當(dāng)touch后還沒(méi)有拖動(dòng)的時(shí)候,值是YES,否則NO困食;
scrollView.zoomBouncing;//當(dāng)內(nèi)容放大到最大或者最小的時(shí)候,值是YES,否則NO
scrollView.zooming;//當(dāng)正在縮放的時(shí)候,值是YES,否則NO
scrollView.decelerating;//當(dāng)滾動(dòng)后,手指放開(kāi),但是還在繼續(xù)滾動(dòng)中,這個(gè)時(shí)候是 YES,其他是NO
scrollView.decelerationRate;//設(shè)置手指放開(kāi)后的減速率
scrollView.maximumZoomScale;//一個(gè)浮點(diǎn)數(shù),表示能放最大的倍數(shù)
scrollView.minimumZoomScale;//一個(gè)浮點(diǎn)數(shù),表示能縮最小的倍數(shù)
scrollView.pagingEnabled;//當(dāng)值是YES,會(huì)自動(dòng)滾動(dòng)到subview的邊界,默認(rèn)是NO
scrollView.scrollEnabled;//決定是否可以滾動(dòng)
scrollView.delaysContentTouches;
//是個(gè)布爾值,當(dāng)值是YES的時(shí)候,用戶觸碰開(kāi)始,scroll view要延遲一會(huì),看看是否用戶有意圖滾動(dòng),假如滾動(dòng)了,那么捕捉touch-down事件,否則就不捕捉, 假如值是NO,當(dāng)用戶觸碰, scroll view會(huì)立即觸發(fā)touchesShouldBegin:withEvent:inContentView:, 默認(rèn)是YES
scrollView.canCancelContentTouches;
//當(dāng)值是YES的時(shí)候,用戶觸碰后翎承,然后在一定時(shí)間內(nèi)沒(méi)有移動(dòng)硕盹,scrollView發(fā)送tracking events,然后用戶移動(dòng)手指足夠長(zhǎng)度觸發(fā)滾動(dòng)事件叨咖,這個(gè)時(shí)候瘩例,scrollView發(fā)送了touchesCancelled:withEvent: 到subview啊胶,然后scroView開(kāi)始滾動(dòng)
//假如值是NO,scrollView發(fā)送tracking events后,就算用戶移動(dòng)手指垛贤,scrollView也不會(huì)滾動(dòng)
scrollView.contentSize;//里面內(nèi)容的大小焰坪,也就是可以滾動(dòng)的大小,默認(rèn)是0聘惦,沒(méi)有滾動(dòng)效果某饰。
scrollView.showsHorizontalScrollIndicator;//滾動(dòng)時(shí),是否顯示水平滾動(dòng)條
scrollView.showsVerticalScrollIndicator;//滾動(dòng)時(shí),是否顯示垂直滾動(dòng)條
scrollView.bounces;//默認(rèn)是yes,就是滾動(dòng)超過(guò)邊界,會(huì)反彈有反彈回來(lái)的效果,假如是 NO,那么滾動(dòng)到達(dá)邊界,那么會(huì)連忙停止
scrollView.bouncesZoom;//和bounces類似,區(qū)別在于,這個(gè)效果反映在縮放上面,假如縮放超過(guò)最大縮放,那么會(huì)反彈效果,假如是NO,則到達(dá)最大或者最小的時(shí)候,立即停止
scrollView.directionalLockEnabled;
//默認(rèn)是NO, 可以在垂直和水平方向同時(shí)運(yùn)動(dòng), 當(dāng)值是YES, 假如一開(kāi)始是垂直或者是水平運(yùn)動(dòng),那么接下來(lái)會(huì)鎖定另外一個(gè)方向的滾動(dòng), 假如一開(kāi)始是對(duì)角方向滾動(dòng),則不會(huì)禁止某個(gè)方向
scrollView.indicatorStyle;
//滾動(dòng)條的樣式,基本只是設(shè)置顏色,總共3個(gè)顏色,默認(rèn),黑色的,白色的
scrollView.scrollIndicatorInsets;
//設(shè)置滾動(dòng)條的位置
二、注意事項(xiàng):
1.不能滾動(dòng):
- contentSize 這個(gè)屬性善绎,比uiscrollview的frame要小, 無(wú)需滾動(dòng), 自然就滾動(dòng)不了露乏。
- scrollenabled 這個(gè)屬性,標(biāo)識(shí)著是否允許滾動(dòng)涂邀,要言設(shè)成yes
- 另外還有一些比較隱蔽的原因. 如果這個(gè)scrollView是在IB里面生成的話,還得手動(dòng)設(shè)置它的contentSize,并且不能在initWithNibName:bundle:里面設(shè)置,因?yàn)門he nib file you specify is not loaded right away. It is loaded the first time the view controller’s view is accessed. If you want to perform additional initialization after the nib file is loaded, override theviewDidLoad method and perform your tasks there.
三、代理方法:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
// any offset changes 只要scrollView的content 這個(gè)方法在任何方式觸發(fā) contentOffset
// 變化的時(shí)候都會(huì)被調(diào)用(包括用戶拖動(dòng)箱锐,減速過(guò)程比勉,直接通過(guò)代碼設(shè)置等),可以用于監(jiān)控 contentOffset
// 的變化驹止,并根據(jù)當(dāng)前的 contentOffset 對(duì)其他 view 做出隨動(dòng)調(diào)整浩聋。
// called on start of dragging (may require some time and or distance to move)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
// 用戶開(kāi)始拖動(dòng) scroll view 的時(shí)候被調(diào)用,可能需要一些時(shí)間和距離移動(dòng)之后才會(huì)觸發(fā)臊恋。
// called on finger up if the user dragged. velocity is in points/millisecond.
// targetContentOffset may be changed to adjust where the scroll view comes to rest
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0);
// 在 didEndDragging 前被調(diào)用衣洁,當(dāng) willEndDragging 方法中 velocity 為 CGPointZero
//(結(jié)束拖動(dòng)時(shí)兩個(gè)方向都沒(méi)有速度)時(shí),didEndDragging 中的 decelerate 為 NO抖仅,即沒(méi)有減速過(guò)程坊夫,
//willBeginDecelerating 和 didEndDecelerating 也就不會(huì)被調(diào)用。反之撤卢,
// 當(dāng) velocity 不為 CGPointZero 時(shí)环凿,scroll view 會(huì)以 velocity 為初速度,
// 減速直到 targetContentOffset放吩。
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
// 在用戶結(jié)束拖動(dòng)后被調(diào)用智听,decelerate 為 YES 時(shí),
// 結(jié)束拖動(dòng)后會(huì)有減速過(guò)程渡紫。注到推,在 didEndDragging 之后,如果有減速過(guò)程惕澎,
// scroll view 的 dragging 并不會(huì)立即置為 NO莉测,而是要等到減速結(jié)束之后,
// 所以這個(gè) dragging 屬性的實(shí)際語(yǔ)義更接近 scrolling集灌。
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView; // 減速動(dòng)畫開(kāi)始前被調(diào)用悔雹。
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
// 減速動(dòng)畫結(jié)束時(shí)被調(diào)用复哆,這里有一種特殊情況:當(dāng)一次減速動(dòng)畫尚未結(jié)束的時(shí)候再次 drag scroll view,
// didEndDecelerating 不會(huì)被調(diào)用腌零,并且這時(shí) scroll view 的 dragging 和 decelerating 屬性都是 YES梯找。
// 新的 dragging 如果有加速度,那么 willBeginDecelerating 會(huì)再一次被調(diào)用益涧,然后才是 didEndDecelerating锈锤;
// 如果沒(méi)有加速度,雖然 willBeginDecelerating 不會(huì)被調(diào)用闲询,但前一次留下的 didEndDecelerating 會(huì)被調(diào)用
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;
// called when setContentOffset/scrollRectVisible:animated: finishes. not called if not animating
- (void)scrollViewDidZoom:(UIScrollView *)scrollView NS_AVAILABLE_IOS(3_2);
// any zoom scale changes view縮放改變的時(shí)候調(diào)用久免。
- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
// return a view that will be scaled. if delegate returns nil, nothing happens
告訴代理要縮放那個(gè)控件。
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view NS_AVAILABLE_IOS(3_2);
// called before the scroll view begins zooming its content縮放開(kāi)始的時(shí)候調(diào)用
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale;
// scale between minimum and maximum. called after any 'bounce' animations縮放完畢的時(shí)候調(diào)用扭弧。
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView; // return a yes if you want to scroll to the top. if not defined, assumes YES- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;
// called when scrolling animation finished. may be called immediately if already at top滾動(dòng)動(dòng)畫完成時(shí)調(diào)用阎姥。
具體應(yīng)用
1.經(jīng)常用到的是新特性界面
Masonry自動(dòng)布局