日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ios UIScrollView 基础属性

發(fā)布時(shí)間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios UIScrollView 基础属性 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

轉(zhuǎn)

UIScrollView 原理

??? 在滾動(dòng)過程當(dāng)中,其實(shí)是在修改原點(diǎn)坐標(biāo)。當(dāng)手指觸摸后, scroll view會(huì)暫時(shí)攔截觸摸事件,使用一個(gè)計(jì)時(shí)器。假如在計(jì)時(shí)器到點(diǎn)后沒有發(fā)生手指移動(dòng)事件,那么 scroll view 發(fā)送 tracking events 到被點(diǎn)擊的 subview。假如在計(jì)時(shí)器到點(diǎn)前發(fā)生了移動(dòng)事件,那么 scroll view 取消 tracking 自己發(fā)生滾動(dòng)。

??? 子類可以重載

touchesShouldBegin:withEvent:inContentView: 決定自己是否接收 touch 事件
pagingEnabled:當(dāng)值是 YES 會(huì)自動(dòng)滾動(dòng)到 subview 的邊界,默認(rèn)是NO
touchesShouldCancelInContentView: 開始發(fā)送 tracking messages 消息給 subview 的時(shí)候調(diào)用這個(gè)方法,決定是否發(fā)送 tracking messages 消息到subview。假如返回 NO,發(fā)送。YES 則不發(fā)送。
假如 canCancelContentTouches屬性是NO,則不調(diào)用這個(gè)方法來影響如何處理滾動(dòng)手勢(shì)。

??? scroll view 還處理縮放和平移手勢(shì),要實(shí)現(xiàn)縮放和平移,必須實(shí)現(xiàn)委托 viewForZoomingInScrollView:、scrollViewDidEndZooming:withView:atScale:
兩個(gè)方法。另外 maximumZoomScale和minimumZoomScale 兩個(gè)屬性要不一樣。

幾個(gè)屬性介紹

tracking
當(dāng) touch 后還沒有拖動(dòng)的時(shí)候值是YES,否則NO

zoomBouncing
當(dāng)內(nèi)容放大到最大或者最小的時(shí)候值是 YES,否則 NO

zooming
當(dāng)正在縮放的時(shí)候值是 YES,否則 NO

decelerating
當(dāng)滾動(dòng)后,手指放開但是還在繼續(xù)滾動(dòng)中。這個(gè)時(shí)候是 YES,其它時(shí)候是 NO

decelerationRate
設(shè)置手指放開后的減速率

maximumZoomScale
一個(gè)浮點(diǎn)數(shù),表示能放最大的倍數(shù)

minimumZoomScale?
一個(gè)浮點(diǎn)數(shù),表示能縮最小的倍數(shù)

pagingEnabled
當(dāng)值是 YES 會(huì)自動(dòng)滾動(dòng)到 subview 的邊界。默認(rèn)是NO

scrollEnabled
決定是否可以滾動(dòng)

delaysContentTouches
是個(gè)布爾值,當(dāng)值是 YES 的時(shí)候,用戶觸碰開始,scroll view要延遲一會(huì),看看是否用戶有意圖滾動(dòng)。假如滾動(dòng)了,那么捕捉 touch-down 事件,否則就不捕捉。假如值是NO,當(dāng)用戶觸碰, scroll view 會(huì)立即觸發(fā) touchesShouldBegin:withEvent:inContentView:,默認(rèn)是 YES

canCancelContentTouches
當(dāng)值是 YES 的時(shí)候,用戶觸碰后,然后在一定時(shí)間內(nèi)沒有移動(dòng),scrollView 發(fā)送 tracking events,然后用戶移動(dòng)手指足夠長(zhǎng)度觸發(fā)滾動(dòng)事件,這個(gè)時(shí)候,scrollView 發(fā)送了 touchesCancelled:withEvent: 到 subview,然后 scroView 開始滾動(dòng)。假如值是 NO,scrollView 發(fā)送 tracking events 后,就算用戶移動(dòng)手指,scrollView 也不會(huì)滾動(dòng)。

contentSize
里面內(nèi)容的大小,也就是可以滾動(dòng)的大小,默認(rèn)是0,沒有滾動(dòng)效果。

showsHorizontalScrollIndicator
滾動(dòng)時(shí)是否顯示水平滾動(dòng)條

showsVerticalScrollIndicator
滾動(dòng)時(shí)是否顯示垂直滾動(dòng)條

bounces
默認(rèn)是 yes,就是滾動(dòng)超過邊界會(huì)反彈有反彈回來的效果。假如是 NO,那么滾動(dòng)到達(dá)邊界會(huì)立刻停止。

bouncesZoom
和 bounces 類似,區(qū)別在于:這個(gè)效果反映在縮放上面,假如縮放超過最大縮放,那么會(huì)反彈效果;假如是 NO,則到達(dá)最大或者最小的時(shí)候立即停止。

directionalLockEnabled
默認(rèn)是 NO,可以在垂直和水平方向同時(shí)運(yùn)動(dòng)。當(dāng)值是 YES 時(shí),假如一開始是垂直或者是水平運(yùn)動(dòng),那么接下來會(huì)鎖定另外一個(gè)方向的滾動(dòng)。 假如一開始是對(duì)角方向滾動(dòng),則不會(huì)禁止某個(gè)方向

indicatorStyle
滾動(dòng)條的樣式,基本只是設(shè)置顏色。總共3個(gè)顏色:默認(rèn)、黑、白

scrollIndicatorInsets

設(shè)置滾動(dòng)條的位置

//基本屬性 //設(shè)置UIScrollView滾動(dòng)的位置 @property(nonatomic) CGPoint contentOffset; //設(shè)置UIScrollView內(nèi)容的尺寸,滾動(dòng)范圍 @property(nonatomic) CGSize contentSize; //設(shè)置UIScrollView的4周增加額外的滾動(dòng)區(qū)域 @property(nonatomic) UIEdgeInsets contentInset; //設(shè)置UIScrollView是否需要彈簧效果 @property(nonatomic) BOOL bounces;//設(shè)置UIScrollView是否能滾動(dòng) @property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled; //設(shè)置UIScrollView是否顯示水平滾動(dòng)條 @property(nonatomic) BOOL showsHorizontalScrollIndicator;//設(shè)置UIScrollView是否顯示垂直滾動(dòng)條 @property(nonatomic) BOOL showsVerticalScrollIndicator;

?

?

?

scrollview里面的view拖動(dòng)的問題

請(qǐng)教一下各位一個(gè)問題:
我現(xiàn)在在一個(gè)scrollview上排列了很多view,這個(gè)scrollview是可以滾動(dòng)的,我還想拖動(dòng)view,但 是問題出現(xiàn)了,如果scrollview只能垂直滾動(dòng)的話,橫向拖動(dòng)view是沒問題的,但是豎向拖動(dòng)view就會(huì)導(dǎo)致scrollview滾動(dòng),而本意 要移動(dòng)的view卻不動(dòng)了. scrollview不響應(yīng)用戶觸摸的話,它自己就不能拖動(dòng)了吧?我的目的是它也能動(dòng),但是其他view動(dòng)的時(shí)候他不能動(dòng)

解決了,在touchbegain中禁止scrollview滾動(dòng),然后在touchend中開啟scrollview滾動(dòng)

?

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

今天實(shí)驗(yàn)了一次,scrollview默認(rèn)就是這么實(shí)現(xiàn)的,所以我不用自己重寫這個(gè)方法,
scrollview的工作原理是:當(dāng)手指觸摸后, scroll view會(huì)暫時(shí)攔截觸摸事件,使用一個(gè)?計(jì)時(shí)器,假如在計(jì)時(shí)器到點(diǎn)后,沒有發(fā)生手指移動(dòng)事件,?那么,scroll view發(fā)送tracking events到被點(diǎn)擊的subview,?假如在計(jì)時(shí)器到點(diǎn)前,發(fā)生了移動(dòng)事件,那么 scroll view 取消tracking?自己發(fā)生滾動(dòng).?
我最后的解決辦法很無語,在touchbegain中,禁止scrollview的滾動(dòng),在touchend中打開scrollview的滾動(dòng)

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


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

//自定義的view,放到scrollview上
//其實(shí)正常的view就可以加到scrollview上,我之所以要自定義這么一個(gè)中間view,是因?yàn)槲乙貙憈ouch的所有方法
//重寫touch方法的原因是,我要在touchBegain中讓scrollview的滾動(dòng)失效,而在touchEnd中讓滾動(dòng)有效
UIMyView *_myView=[[UIMyView alloc] init];

//需要拖動(dòng)的view
UIView *_view = [[UIView alloc] init];



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


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


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


....

#pragma
mark -- #pragma mark touch - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { .....你自己的代碼......UITouch *touch = [touches anyObject];//如果是主view,則不進(jìn)行操作 if ([touch view]==self) {return; }//由于中間隔了一層自定義的view,所以要兩次superview UIScrollView *_scrollview = (UIScrollView *)[[[touch view] superview] superview]; _scrollview.scrollEnabled=NO;//讓scrollview停止響應(yīng)滾動(dòng) .....你自己的代碼...... }- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { .....你自己的代碼...... UITouch *touch = [touches anyObject];UIScrollView *_scrollview = (UIScrollView *)[[[touch view] superview] superview]; _scrollview.scrollEnabled=YES;//讓scrollview可以響應(yīng)滾動(dòng) .....你自己的代碼...... }

-----------------------------------------------


UIScrollView 代理(delegate)

UIScrollView在滾動(dòng)過程中 或者 停止?jié)L動(dòng) 時(shí),如果需要做一些特定的操作,可用通過設(shè)置代理的方式(delegate)來監(jiān)聽UIScrollView的整個(gè)滾動(dòng)過程,當(dāng)UIScrollView發(fā)生一系列的滾動(dòng)操作時(shí), 會(huì)自動(dòng)通知它的代理(delegate)對(duì)象,然后通過代理來監(jiān)聽UIScrollView的滾動(dòng)過程。

UIScrollView將delegate需 要實(shí)現(xiàn)的方法都定義在UIScrollViewDelegate協(xié)議中,因此UIScrollView的delegate必須遵守 UIScrollViewDelegate協(xié)議,然后實(shí)現(xiàn)協(xié)議中相應(yīng)的方法,就可以監(jiān)聽UIScrollView的滾動(dòng)過程

// 用戶開始拖拽時(shí)調(diào)用 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;// 滾動(dòng)到某個(gè)位置時(shí)調(diào)用 - (void)scrollViewDidScroll:(UIScrollView *)scrollView;// 用戶結(jié)束拖拽時(shí)調(diào)用 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

內(nèi)容縮放

UIScrollView不僅能滾動(dòng)顯示大量?jī)?nèi)容,還能對(duì)其內(nèi)容進(jìn)行縮放處理

當(dāng)在UIScrollView身上使用捏合手勢(shì)時(shí),UIScrollView會(huì)調(diào)用代理(delegate)的viewForZoomingInScrollView方法,這個(gè)方法返回的控件就是需要進(jìn)行縮放的控件,縮放涉及的屬性和方法

/****屬性****/ //縮小的對(duì)小比例 @property(nonatomic) CGFloat minimumZoomScale;//放大的最大比例 @property(nonatomic) CGFloat maximumZoomScale; /****方法****/ //縮放時(shí)調(diào)用 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;//開始縮放的時(shí)候調(diào)用 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view//正在縮放的時(shí)候調(diào)用 - (void)scrollViewDidZoom:(UIScrollView *)scrollView

UIScrollView無法滾動(dòng)的解決辦法

如果UIScrollView無法滾動(dòng),可能是以下原因:

5.1 沒有設(shè)置contentSize屬性

5.2 設(shè)置屬性scrollEnabled = NO

5.3 沒有接收到觸摸事件(userInteractionEnabled = NO)

5.4 取消autolayout功能,要想scrollView滾動(dòng),必須取消autolayout

?

?

#import "ViewController.h"@interface ViewController ()<UIScrollViewDelegate> /***UIScrollView*/ @property(nonatomic,strong)UIScrollView *scrollView;/*** UIImageView*/ @property(nonatomic,strong)UIImageView *imageView; @end@implementation ViewController - (void)viewDidLoad {//2.設(shè)置 UIImageView UIImage *image = [UIImage imageNamed:@"scroll.jpg"];self.imageView.image = image;//2.1 設(shè)置圖片范圍CGFloat imageH = image.size.height;CGFloat imageW = image.size.width;CGFloat imageX = 0;CGFloat imageY = 0;self.imageView.frame = CGRectMake(imageX, imageY, imageW, imageH);//3 設(shè)置UIScrollView 屬性//3.2 設(shè)置UIScrollView內(nèi)容的尺寸,滾動(dòng)范圍self.scrollView.contentSize=CGSizeMake(imageW, imageH);//3.2 設(shè)置UIScrollView的4周增加額外的滾動(dòng)區(qū)域CGFloat distance = 100.0f;self.scrollView.contentInset = UIEdgeInsetsMake(distance, distance, distance, distance);//3.3 設(shè)置彈簧效果self.scrollView.bounces = YES;//3.4 設(shè)置滾動(dòng)不顯示self.scrollView.showsHorizontalScrollIndicator=NO;self.scrollView.showsVerticalScrollIndicator=NO;//4 UIImageView 添加到 UIScrollView 中 [self.scrollView addSubview:self.imageView];//5 UIScrollView [self.view addSubview:self.scrollView];//6 設(shè)置代理self.scrollView.delegate = self;//7 縮放self.scrollView.minimumZoomScale=0.2f;self.scrollView.maximumZoomScale=2.0f;}#pragma mark 代理方法 // 用戶開始拖拽時(shí)調(diào)用 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {NSLog(@"開始拖拽"); }// 滾動(dòng)到某個(gè)位置時(shí)調(diào)用 - (void)scrollViewDidScroll:(UIScrollView *)scrollView {NSLog(@"拖拽中"); }// 用戶結(jié)束拖拽時(shí)調(diào)用 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {NSLog(@"結(jié)束拖拽"); }#pragma mark 縮放 /*** 縮放結(jié)束時(shí)調(diào)用** @param scrollView <#scrollView description#>** @return <#return value description#>*/ - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {NSLog(@"開始縮放");return self.imageView; }/*** 縮放過程中調(diào)用** @param scrollView <#scrollView description#>*/ - (void)scrollViewDidZoom:(UIScrollView *)scrollView {NSLog(@"正在縮放"); }/*** 縮放結(jié)束時(shí)調(diào)用** @param scrollView <#scrollView description#>* @param view <#view description#>* @param scale <#scale description#>*/ - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {NSLog(@"縮放結(jié)束"); }#pragma mark 屬性get方法- (UIScrollView *)scrollView {if (!_scrollView) {_scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];}return _scrollView; }- (UIImageView *)imageView {if (!_imageView) {_imageView = [[UIImageView alloc] init];}return _imageView; }@end

===========================================

contentsize是內(nèi)容的寬和高,contentsize.width是內(nèi)容的寬度,contentsize.heght是高度,contentsizeUIScrollView的一個(gè)屬性,它是一個(gè)CGSize,是由核心圖形所定義的架構(gòu),那定義了你可以滾軸內(nèi)容的寬度和高度,你也可以添加可以上下滾動(dòng)的額外區(qū)域。第一種方法是你可以通過添加內(nèi)容的大小來完成。另外一個(gè)比較動(dòng)態(tài)的選擇是UIScrollView的另一個(gè)屬性contentInsetcontentInset增加你在contentsize中指定的內(nèi)容能夠滾動(dòng)的上下左右區(qū)域數(shù)量contentInset.top以及contentInset.buttom分別表示上面和下面的距離。

???????????在滾軸視圖中,有一個(gè)叫做ContentOffset的屬性跟蹤UIScrollView的具體位置,你能夠自己獲取和設(shè)置它,ContentOffset是你當(dāng)前可視內(nèi)容在滾軸視圖邊界的左上角那個(gè)點(diǎn)。如圖:


???????????可以看出,ContentOffset內(nèi)容中的那個(gè)點(diǎn)不是從contentInset的左上角開始的,而是內(nèi)容的左上角,此時(shí)的ContentOffset是正值,但有時(shí)也是負(fù)值,如下圖所示:

?

?

?

//使用一個(gè)ScrollView //創(chuàng)建一個(gè)UIScrollView CGRectframe = CGRectMake( 0, 0, 200, 200); scrollView= [[UIScrollView alloc] initWithFrame: frame];//添加子視圖(框架可以超過scroll view的邊界) frame= CGRectMake( 0, 0, 500, 500); myImageView= [[UIImageView alloc] initWithFrame: frame]; [scrollViewaddSubview:myImageView];//設(shè)置內(nèi)容尺寸 scrollView.contentSize= CGSize(500,500);

擴(kuò)展Scroll View?的行為

??????應(yīng)用程序通常需要知道有關(guān)的滾圖的事件

??????????? scrolloffset改變的時(shí)候

???????????拖動(dòng)開始和結(jié)束

????????????減速的開始和結(jié)束


通過子類化擴(kuò)展Scroll View?的行為

????????創(chuàng)建一個(gè)子類

????????重寫一些功能并改變行為

????????關(guān)于這種方式的爭(zhēng)議

??

?

?


轉(zhuǎn)載于:https://www.cnblogs.com/allanliu/p/4532674.html

總結(jié)

以上是生活随笔為你收集整理的ios UIScrollView 基础属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。