UIScrollView 实践经验

合集下载

南昌龙图教育:使用UIScrollView 如何实现大小不同物品拖动展示

南昌龙图教育:使用UIScrollView 如何实现大小不同物品拖动展示

南昌龙图教育:使用UIScrollView 如何实现大小不同物品拖动展示1、概述UI部分一直是cocos2d-x的弱项,而这种境况在3.0版本中将得到改善。

让我们从一个曾经的坑入手,来看看这些新特性。

大家都知道,有个这样一个坑叫做CCTableView。

它的作用是来创建一个可拖动的view,来进行展示。

但它有的问题是只能创建等宽等高的一组元素,这就出现问题了。

比如一个聊天下拉框,总不能限制人说话的长度吧….. 所以它的存在聊胜于无,不断被吐槽。

让我们看看新版中这个问题是如何处理的,先上个图:2、创建ScrollView打开CocoStudio的UI编辑器,创建一个新工程,在画布列表中将名字更为:“ScrollView”然后在侧边栏中找到“滚动层”,拖动到编辑界面上。

调整区域的大小,在属性->尺寸和模式进行调整。

注意不要直接拖动边框,那样只会改变缩放比-_- b然后在滚动层中拖入子button,并设置它们的基本属性:名称点击图片之类的。

创建部分有不明白的童鞋可以看先前的:Cocos2d-x 3.0 开发(四)使用CocoStudio创建UI并载入到程序中创建了一堆控件:3、设置ScrollView属性选中ScroView在它的属性中做如下配置:我们注意到,其中重要的参数有两个。

滑动方向我们可以设置:水平、竖直、两种都有。

这里我们选择水平。

区域宽度是可滑动区域的大小,如果不更改默认是与View区域等大,这时是不能滑动的。

我们将其更改为1000,会发现在先前的区域外有增大的一部分。

接下来我们在增大的区域中添加我们需要的物品。

另外有个细节,就是我们将滑动区域边缘的物体调成有一部分超出界限,这样就会给用户可拖动的暗示。

最后记得勾选模拟裁切,否则的话,View扩展区域的东西是会显示出来的。

保存工程,导出我们的文件。

4、加载到程序运行脚本新建一个程序:testScrollView。

添加库依赖,忘记添加方法的同学可以参照:Cocos2d-x 3.0 开发(十一)3.0 alpha1文件结构变化更改Init方法:1.bool HelloWorld::init()2.{3.//////////////////////////////4.// 1. super init first5.if ( !Layer::init() )6. {7.return false;8. }9.10. Size visibleSize = Director::getInstance()->getVisibleSize();11. Point origin = Director::getInstance()->getVisibleOrigin();12.13. auto widget = dynamic_cast<gui::UILayout*>(cocostudio::GUIReader::shareReader()->widgetFromJsonFile("ScrollView.json"));14. auto layer = gui::UILayer::create();15. layer->addWidget(widget);16.this->addChild(layer);17.return true;18.}编译运行。

ios之UIScrollerView滚动视图总结

ios之UIScrollerView滚动视图总结

ios之UIScrollerView滚动视图总结UIScrollView 类负责所有基于 UIKit 的滚动操作。

⼀、创建CGRect bounds = [ [ UIScreen mainScreen ] applicationFrame ] ;UIScrollView* scrollView = [ [UIScrollView alloc ] initWithFrame:bounds ];当你创建完滚动视图后,你可以将另⼀个视图的内容粘合到滚动视图的空⽩页上。

这回创建⼀个滚动的内容窗⼝:[ scrollView addSubview:myView];你必须给出内容的实际⼤⼩,这样滚动视图才知道滚动的范围:scrollView.contentSize = myView.frame.size;要开启缩放功能需要调整视图的两个属性,分别是maxinumZoomScale 和 mininumZoomScale 。

这样就可以允许⽤户使⽤捏合⼿势调整内容⼤⼩:scrollView.maxinumZoomScale = 2.0;//允许放⼤2倍scrollView.mininumZoomScale = 0.5;//允许放⼤到0.5倍要打开缩放功能,你还需要增加⼀个UIScrollViewDelegate 代理,通过⼀个名为 viewForZoomingScrollView的⽅法做出响应。

这个⽅法会返回进⾏缩放时所使⽤的 UIView 对象:scrollView.delegate = self;- (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView{retutn myView;}Tips:对于⼤规模数据,你可能会在最初使⽤⼀个低于实际⼤⼩(1.0)的缩放⽐例,让⽤户可以平滑地进⾏放⼤。

⼆、属性除了上⾯⽤到的缩放属性外,滚动视图还有会让你多其他属性,可以对现实内容的⾏为进⾏微调。

swiftui scrollview嵌套 滚动冲突 简书

swiftui scrollview嵌套 滚动冲突 简书

swiftui scrollview嵌套滚动冲突简书标题:SwiftUI ScrollView嵌套滚动冲突简述引言概述:SwiftUI是一种用于构建用户界面的现代化框架,它提供了许多强大的功能。

其中,ScrollView是一种常用的视图容器,用于显示超出屏幕范围的内容。

然而,在使用ScrollView进行嵌套时,可能会遇到滚动冲突的问题。

本文将详细介绍SwiftUI ScrollView嵌套滚动冲突的原因以及解决方案。

正文内容:1. 嵌套滚动冲突的原因1.1 内容超出屏幕范围1.2 嵌套的ScrollView之间的滚动事件冲突1.3 SwiftUI的滚动冲突处理机制2. 解决方案2.1 使用GeometryReader获取父视图的尺寸2.2 使用PreferenceKey解决滚动冲突2.3 使用UIScrollView嵌套解决滚动冲突2.4 使用嵌套的LazyVStack替代ScrollView2.5 使用List替代ScrollView3. 解决方案详细阐述3.1 使用GeometryReader获取父视图的尺寸:通过GeometryReader可以获取到父视图的尺寸,从而可以根据需要调整子视图的布局,避免滚动冲突的问题。

3.2 使用PreferenceKey解决滚动冲突:PreferenceKey是一种用于在视图层次结构中传递数据的机制,可以通过它来解决嵌套ScrollView之间的滚动冲突问题。

3.3 使用UIScrollView嵌套解决滚动冲突:在需要嵌套的ScrollView外部包裹一个UIScrollView,并通过设置UIScrollView的isScrollEnabled属性来实现滚动冲突的解决。

3.4 使用嵌套的LazyVStack替代ScrollView:LazyVStack是SwiftUI中一种用于垂直布局的视图容器,可以替代ScrollView来避免滚动冲突。

3.5 使用List替代ScrollView:List是SwiftUI中一种用于显示列表数据的视图容器,它内部已经实现了滚动冲突的解决,因此可以替代ScrollView来避免滚动冲突。

Android--UI之ScrollView

Android--UI之ScrollView

Android--UI之ScrollView前⾔ 本篇博客主要讲解ScrollView和HorizontalScrollView两个容器的使⽤。

它们分别代表了垂直滚动以及⽔平滚动,滚动的内容是它其中包含的View。

在本篇会简单介绍ScrollView和HorizontalScrollView的使⽤以及注意事项,最后以⼀个简单的Demo来演⽰⼀下这两个容器的使⽤。

ScrollView ,通过官⽅⽂档的继承关系可以看出,它继承⾃FrameLayout,所以它是⼀种特殊类型的FrameLayout,因为它可以使⽤⽤户滚动显⽰⼀个占据的空间⼤于物理显⽰的视图列表。

值得注意的是,ScrollView只能包含⼀个⼦视图或视图组,在实际项⽬中,通常包含的是⼀个垂直的LinearLayout。

值得注意的是,ScrollView不能和ListView⼀起使⽤,因为ListView已经对垂直⽅向的滚动做了处理,它会迫使如果ListView的内容⼤于物理视图的内容的时候,强制垂直滚动的效果,所以这⾥使⽤ScrollView和ListView混合使⽤是没有意义的,对于ListView的讲解,可以参见我的另外⼀篇博客:Android--UI之ListView。

ScrollView还需要注意EditText⾃带的多⾏输⼊的滚动效果,也是不可以混合使⽤的,如果在ScrollView中包含了多⾏的EditText,那EditText中⾃带的滚动效果将失效。

其中⼼思想就是ScrollView是⼀个滚动视图的容器,对于⼀些⾃带了滚动效果的控件,是⽆法和它⼀起被混合使⽤的。

在Android平台下,与ScrollView类似的还有⼀个HorizontalScrollView容器,这个容器与ScrollView的作⽤相反,主要适⽤于⽔平滚动,了解了ScrollView就基本上了解了HorizontalScrollView,所以这⾥着重讲解ScrollView的使⽤。

IOS开发UIScrollView控件详解

IOS开发UIScrollView控件详解

IOS开发UIScrollView控件详解// 触摸屏幕来滚动画面还是其他的方法使得画面滚动,皆触发该函数- (void)scrollViewDidScroll:(UIScrollView *)scrollView {NSLog(@"Scrolling...");}// 触摸屏幕并拖拽画面,再松开,最后停止时,触发该函数- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {NSLog(@"scrollViewDidEndDragging - End of Scrolling.");}// 滚动停止时,触发该函数- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {NSLog(@"scrollViewDidEndDecelerating - End of Scrolling.");}// 调用以下函数,来自动滚动到想要的位置,此过程中设置有动画效果,停止时,触发该函数// UIScrollView的setContentOffset:animated:// UIScrollView的scrollRectToVisible:animated:// UITableView的scrollToRowAtIndexPath:atScrollPosition:animated:// UITableView的selectRowAtIndexPath:animated:scrollPosition:- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {NSLog(@"scrollViewDidEndScrollingAnimation - End of Scrolling.");}首先实现UIScrollViewDelegate协议:[plain] view plaincopy1.#import <UIKit/UIKit.h>2.3.@interface Activity01ViewController : UIViewController< UIScrollViewDelegate>{4.UIScrollView *myscrollview;5.}6.@property (nonatomic,retain) UIScrollView *myscrollview;7.@end实现协议的下列方法:[plain] view plaincopy1.#import <UIKit/UIKit.h>2.3.@interface Activity01ViewController : UIViewController< UIScrollViewDelegate>{4.UIScrollView *myscrollview;5.}6.@property (nonatomic,retain) UIScrollView *myscrollview;7.@end对myscrollview进行初始化:[plain] view plaincopy1.- (void)viewDidLoad2.{3.[super viewDidLoad];4.// Do any additional setup after loading the view, typicall y from a nib.5.myscrollview = [[UIScrollView alloc] initWithFrame:CGRec tMake(0.0, 44,768, 1004)];6.myscrollview.directionalLockEnabled = YES; //只能一个方向滑动7.myscrollview.pagingEnabled = NO; //是否翻页8.myscrollview.backgroundColor = [UIColor blackColor];9.myscrollview.showsVerticalScrollIndicator =YES; //垂直方向的滚动指示10.myscrollview.indicatorStyle = UIScrollViewIndicatorStyl eWhite;//滚动指示的风格11.myscrollview.showsHorizontalScrollIndicator = NO;//水平方向的滚动指示12.myscrollview.delegate = self;13.CGSize newSize = CGSizeMake(self.view.frame.size.wid th, self.view.frame.size.height+1);14.[myscrollview setContentSize:newSize];15.16.float x=0;17.float y=0;18.float width =768;19.float height = 1004;20.21.UIImageView *myimage = [[UIImageView alloc] initWi thImage:[UIImage imageNamed:@"Activity01.png"]];22.//[myimage setContentMode:UIViewContentModeSca leAspectFill];23.[myimage setFrame:CGRectMake(x, y, width, height)];24.[myscrollview addSubview:myimage];25.26.27.[self.view addSubview:myscrollview];28.}属性总结:属性作用CGPoint contentOffSet 监控目前滚动的位置CGSize contentSize 滚动范围的大小UIEdgeInsets contentInset 视图在scrollView中的位置id<UIScrollerViewDelegate> delegate 设置协议BOOL directionalLockEnabled 指定控件是否只能在一个方向上滚动BOOL bounces 控制控件遇到边框是否反弹BOOL alwaysBounceVertical 控制垂直方向遇到边框是否反弹BOOL alwaysBounceHorizontal 控制水平方向遇到边框是否反弹BOOL pagingEnabled 控制控件是否整页翻动BOOL scrollEnabled 控制控件是否能滚动BOOL showsHorizontalScrollIndicator 控制是否显示水平方向的滚动条BOOL showsVerticalScrollIndicator 控制是否显示垂直方向的滚动条UIEdgeInsets scrollIndicatorInsets 指定滚动条在scrollerView 中的位置UIScrollViewIndicatorStyleindicatorStyle 设定滚动条的样式float decelerationRate 改变scrollerView的减速点位置BOOL tracking 监控当前目标是否正在被跟踪BOOL dragging 监控当前目标是否正在被拖拽BOOL decelerating 监控当前目标是否正在减速BOOL delaysContentTouches 控制视图是否延时调用开始滚动的方法BOOL canCancelContentT ouches 控制控件是否接触取消touch的事件float minimumZoomScale 缩小的最小比例float maximumZoomScale 放大的最大比例float zoomScale 设置变化比例BOOL bouncesZoom 控制缩放的时候是否会反弹BOOL zooming 判断控件的大小是否正在改变BOOL zoomBouncing 判断是否正在进行缩放反弹BOOL scrollsToT op 控制控件滚动到顶部注意:1、使scrollview不要上下滑动,可以设置scrollview.contentSize = CGSizeMake(你要的长度, 0);协议方法解释:[plain] view plaincopy1.#pragma mark UIScrollViewDelegate2.//只要滚动了就会触发3.- (void)scrollViewDidScroll:(UIScrollView *)scrollView;4.{5.// NSLog(@" scrollViewDidScroll");6.NSLog(@"ContentOffset x is %f,yis %f",scrollView.conten tOffset.x,scrollView.contentOffset.y);7.}8.//开始拖拽视图9.- (void)scrollViewWillBeginDragging:(UIScrollView *)scroll View;10.{11.NSLog(@"scrollViewWillBeginDragging");12.}13.//完成拖拽14.- (void)scrollViewDidEndDragging:(UIScrollView *)scrol lView willDecelerate:(BOOL)decelerate;15.{16.NSLog(@"scrollViewDidEndDragging");17.}18.//将开始降速时19.- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;20.{21.NSLog(@"scrollViewWillBeginDecelerating");22.}23.24.//减速停止了时执行,手触摸时执行执行25.- (void)scrollViewDidEndDecelerating:(UIScrollView *)s crollView;26.{27.NSLog(@"scrollViewDidEndDecelerating");28.}29.//滚动动画停止时执行,代码改变时出发,也就是setContentOffset改变时30.- (void)scrollViewDidEndScrollingAnimation:(UIScrollVi ew *)scrollView;31.{32.NSLog(@"scrollViewDidEndScrollingAnimation");33.}34.//设置放大缩小的视图,要是uiscrollview的subview35.- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;36.{37.NSLog(@"viewForZoomingInScrollView");38.return viewA;39.}40.//完成放大缩小时调用41.- (void)scrollViewDidEndZooming:(UIScrollView *)scrol lView withView:(UIView *)view atScale:(float)scale;42.{43.viewA.frame=CGRectMake(50,0,100,400);44.NSLog(@"scale between minimum and maximum. call ed after any 'bounce' animations");45.}// scale between minimum and maximum. called afte r any 'bounce' animations46.47.//如果你不是完全滚动到滚轴视图的顶部,你可以轻点状态栏,那个可视的滚轴视图会一直滚动到顶部,那是默认行为,你可以通过该方法返回NO来关闭它48.- (BOOL)scrollViewShouldScrollToT op:(UIScrollView *)s crollView;49.{50.NSLog(@"scrollViewShouldScrollT oTop");51.returnYES;52.}53.54.- (void)scrollViewDidScrollToTop:(UIScrollView *)scroll View;55.{56.NSLog(@"scrollViewDidScrollT oTop");57.}。

瀑布流UIScrollView实现

瀑布流UIScrollView实现

瀑布流UIScrollView实现本文实现的是瀑布流,通过UIScrollView简单实现的,主要简单实现瀑布流的效果,希望对各位读者有所帮助,大体的实现思路是,通过创建一个plist文件来获取需要加载的图片,通过创建三列视图,添加到scrollView上依次向这个三列视图的添加图片,通过判断每一列视图高度得到哪列视图的高度最低,下次添加图片时往那个高度最低的视图上添加,添加一次判断一次,本人写的这篇实现较简单,并没有考虑太多情况,希望对各位读者有所帮助。

这个是瀑布流实现所定义的一些类和一个开源框架UrlImageView,这个开源框架主要是用来加载网络图片的。

1.个人写的这个瀑布流是先通过定义一个data.plist文件,把所有用到的关于图片信息的内容放入到这个plist文件中这个每个item中添加的内容2.通过定义两个model对象,一个是DataAccess和DataInfo<1.>在DataAccess中主要定一个一个方法,通过这个方法读取plist 文件[objc]view plaincopyprint?1.#import "DataAccess.h"2.#import "DataInfo.h"3.@implementation DataAccess4.- (NSMutableArray *)getDataArray{5.6.NSString * filePath = [[NSBundle mainBundle] pathForResource:@"dataList"ofType:@"plist"];7.NSDictionary * dic = [NSDictionary dictionaryWithContentsOfFile:filePath];8.NSArray * imageList = [dic objectForKey:@"imageList"];9.NSMutableArray * dataInfoArray = [NSMutableArray array];10.for (NSDictionary * item in imageList) {11.DataInfo * dataInfo = [[DataInfo alloc] init];12.dataInfo.width = [item[@"width"] floatValue];13.dataInfo.height = [item[@"height"] floatValue];14.dataInfo.url = item[@"url"];15.dataInfo.mess = item[@"mess"];16.dataInfo.title = item[@"title"];17.[dataInfoArray addObject:dataInfo];18.}19.20.return dataInfoArray;21.}22.@end<2.>在dataInfo中定义的都是一个model属性[objc]view plaincopyprint?1.#import <Foundation/Foundation.h>2.3.@interface DataInfo : NSObject4.//源图片的宽度5.@property (nonatomic,assign)float width;6.//源图片的高度7.@property (nonatomic,assign)float height;8.//图片的url地址9.@property (nonatomic,copy)NSString * url;10.//图片的名字11.@property (nonatomic,copy)NSString * title;12.@property (nonatomic,copy)NSString * mess;13.@end3.在ViewController中主要实现数据的获取,瀑布流视图的创建[objc]view plaincopyprint?1.- (void)viewDidLoad2.{3.[super viewDidLoad];4.//获取图片的数据5.DataAccess * dataAccess = [[DataAccess alloc] init];6.NSMutableArray * array = [dataAccess getDataArray];7.//创建瀑布流视图,并通过自定init方法将图片数据传个瀑布流视图8.self.whView = [[WHWaterView alloc] initWithData:array];9.//将瀑布流视图添加到self.view10.[self.view addSubview:self.whView];11.12.13.}14.15.16.@end4.MessView这个类主要是对瀑布流视图中的每一个图片的显示和大小的布局主要是通过复写init方法<1.>MessView.h[objc]view plaincopyprint?1.#import <UIKit/UIKit.h>2.#import "DataInfo.h"3.@interface MessView : UIView4.- (id)initWithData:(DataInfo *)dataInfo yPoint:(float)y;5.@end<2.>MessView.m[objc]view plaincopyprint?1.#import "MessView.h"2.#define WIDTH 320/33.#import "UrlImageView.h"4.@implementation MessView5.6.//复写init方法传入数据并且传入y坐标7.- (id)initWithData:(DataInfo *)dataInfo yPoint:(float)y{8.//获得缩略图的高度和宽度9.float imgWidth = dataInfo.width;10.float imgHeight = dataInfo.height;11.float sImgWidth = WIDTH -4;12.float sImgHeight = sImgWidth * imgHeight/imgWidth;13.14.self = [super initWithFrame:CGRectMake(0, y, sImgWidth, sImgHeight)];15.if (self) {16.//通过开源框架UrlImageView直接创建imgView并且在网上加载图片17.UrlImageView * imgView = [[UrlImageView alloc] initWithFrame:CGRectMake(2,2, sImgWidth, sImgHeight)];18.[imgView setImageWithURL:[NSURL URLWithString:dataInfo.url]];19.[self addSubview:imgView];20.//创建label21.UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(2,self.frame.size.height - 28, WIDTH-4, 30)];bel.backgroundColor = [UIColor colorWithWhite:0 alpha:.8];bel.alpha = .5;bel.text = dataInfo.title;bel.textColor = [UIColor whiteColor];26.[self addSubview:label];27.}28.29.return self;30.}5.WHWaterView这个视图继承于UIScrollView通过这个视图来创建完成瀑布流视图的实现<1,>WHWaterView.h[objc]view plaincopyprint?1.#import <UIKit/UIKit.h>2.#define WIDTH 320/33.@interface WHWaterView : UIScrollView{4.//第1.2.3列视图5.UIView * _view1;6.UIView * _view2;7.UIView * _view3;8.int _highColume;//高度最高的那一列9.int _lowColume;//高度最低的那一列10.float _highColumeHeight;//最高列的高度11.12.int _row;//行数13.14.}15.//复写初始化方法创建瀑布流视图对象并且传入数据16.- (id)initWithData:(NSMutableArray *)arrayData;17.@end<2,>WHWaterView.m[objc]view plaincopyprint?1.#import "WHWaterView.h"2.#import "DataInfo.h"3.#import "MessView.h"4.5.@implementation WHWaterView6.7.8.- (id)initWithData:(NSMutableArray *)arrayData{9.10.self = [super initWithFrame:CGRectMake(0, 0, 320, 480)];11.if (self) {12.//初始化参数13.[self initParams];14.for (int i =0; i<arrayData.count;i++) {15.if (i/3>0 && i%3==0) {16._row ++;17.}18.DataInfo * dataInfo =(DataInfo *)[arrayData objectAtIndex:i];19.//如果为第一行的话添加messView20.if (_row ==1) {21.switch (i%3) {22.case 0:23.[self addMessView:_lowColume dataInfo:dataInfo];24.break;25.case 1:26.[self addMessView:_lowColume dataInfo:dataInfo];27.break;28.case 2:29.[self addMessView:_lowColume dataInfo:dataInfo];30.break;31.}32.}else{33.[self addMessView:_lowColume dataInfo:dataInfo];34.}35.//重新获得最低高度的列和最高高度的列36.[self getHighColumeAndLowColume];37.}38.//并且设置当前视图的内容的size39.[self setContentSize:CGSizeMake(320, _highColumeHeight)];40.//将三个视图添加到当前视图41.[self addSubview:_view1];42.[self addSubview:_view2];43.[self addSubview:_view3];44.45.}46.47.return self;48.}49.- (void)initParams{50.//初始化三列视图51._view1 =[[UIView alloc] initWithFrame:CGRectMake(0, 0, WIDTH, 0)];52._view2 =[[UIView alloc] initWithFrame:CGRectMake(WIDTH, 0, WIDTH, 0)];53._view3 =[[UIView alloc] initWithFrame:CGRectMake(WIDTH*2, 0, WIDTH, 0)];54.55.//初始化一系列参数56._highColume = 1;57._lowColume = 1;58._highColumeHeight = 1;59._row = 1;60.61.}62.//添加messView在高度最低的列63.//将messView添加到高度最低的列64.- (void)addMessView:(int)lowColume dataInfo:(DataInfo *)data{65.MessView * messView = nil;66.float hValue = 0;67.switch (lowColume) {68.case 1:69.//创建messView,并且传入数据和messView的y坐标,_view1视图的高度就是messView的y坐标70.messView = [[MessView alloc] initWithData:data yPoint:_view1.frame.size.height];71.hValue = messView.frame.size.height;72.//重新定义_view1的Frame (_view2,_view3与_view1雷同)73._view1.frame =CGRectMake(_view1.frame.origin.x, _view1.frame.origin.y,WIDTH, _view1.frame.size.height+hValue);74.[_view1 addSubview:messView];75.76.break;77.case 2:78.messView = [[MessView alloc] initWithData:data yPoint:_view2.frame.size.height];79.hValue = messView.frame.size.height;80._view2.frame =CGRectMake(_view2.frame.origin.x, _view2.frame.origin.y,WIDTH, _view2.frame.size.height+hValue);81.[_view2 addSubview:messView];82.83.break;84.case 3:85.messView = [[MessView alloc] initWithData:data yPoint:_view3.frame.size.height];86.hValue = messView.frame.size.height;87._view3.frame =CGRectMake(_view3.frame.origin.x, _view3.frame.origin.y,WIDTH, _view3.frame.size.height+hValue);88.[_view3 addSubview:messView];89.90.break;91.}92.93.}94.//重新获得高度最高的列和高度最低的列和高度最高列的高度95.- (void)getHighColumeAndLowColume{96.//这个判断是获得高度最高的列,并且设置97.if (_view1.frame.size.height > _highColumeHeight) {98._highColumeHeight = _view1.frame.size.height;99._highColume = 1;100.}else if (_view2.frame.size.height > _highColumeHeight){101._highColumeHeight = _view2.frame.size.height;102._highColume = 2;103.}else if (_view3.frame.size.height > _highColumeHeight){104._highColumeHeight = _view3.frame.size.height;105._highColume = 3;106.}107.//这个判断是获得高度最低的列108.float view1Height = _view1.frame.size.height;109.float view2Height = _view2.frame.size.height;110.float view3Height = _view3.frame.size.height;111.if (view1Height < view2Height) {112.if (view1Height < view3Height) {113._lowColume = 1;114.}else{115._lowColume = 3;116.}117.}else{118.if (view2Height < view3Height) {119._lowColume = 2;120.}else{121._lowColume = 3; 122.}123.124.}125.}126.@end。

IOS-scrollView详解

IOS-scrollView详解

IOS-scrollView详解引言UIScrollView的是几个UIKit类包括的UITableView和UITextView中的超类。

一个UIScrollView对象(或者,简单地说,一个滚动视图)的核心概念是,它是一个视图,其起源是可调过的内容视图。

它剪辑的内容,它的框架,这通常(但不一定)恰逢该应用程序的主窗口。

滚动视图跟踪手指的变动,并相应调整原点。

这正显示出它的内容“,通过”滚动视图的视图绘制的基础上,新的原点,它被固定在内容视图的偏移部分本身。

滚动视图本身没有绘制,除了显示垂直和水平滚动的指标。

滚动视图必须知道的内容视图的大小,所以它知道何时停止滚动,默认情况下,它“反弹”回来时,滚动超出了内容的范围。

用于管理内容的绘制有关的对象显示在一个滚动视图应该瓦片的内容的子视图,以便没有视图超过屏幕的大小。

当用户在滚动滚动视图,这个对象应该添加和删除子视图是必要的。

由于滚动视图没有滚动条,它必须知道是否触摸信号的意图与滚动意图在内容跟踪一个子视图。

做出此决定,它暂时拦截触摸按下事件通过启动一个定时器,并在定时器触发之前,看是否触摸手指做任何运动。

如果定时器触发无位置显著的变化,滚动视图将跟踪事件的内容视图的感动子视图。

然后,如果用户在定时器期满前拉着自己的手指远远不够,滚动视图将取消任何跟踪的子视图,并进行滚动本身。

子类可以重写touchesShouldBegin :withEvent:方法inContentView :,pagingEnabled和touchesShouldCancelInContentView :方法(这是由滚动视图调用)来影响滚动视图如何处理滚动手势。

滚动视图还处理缩放和平移的内容。

当用户使一个夹在或向外挤压手势,滚动视图调整偏移量和内容的标度。

当手势结束,管理内容视图中的对象应该要更新的内容为必要的子视图。

(请注意,手势可以结束和手指仍可能下跌。

)虽然手势正在进行中,滚动视图不发送任何跟踪调用子视图。

uiscrollview uitableview 简书

uiscrollview uitableview 简书

uiscrollview uitableview 简书
【实用版】
目录
1.iOS 中的 UIScrollView 和 UITableView
2.UIScrollView 的功能和用法
3.UITableView 的功能和用法
4.简书上的应用实例
正文
在 iOS 开发中,UIScrollView 和 UITableView 是两种非常常用的控件。

它们分别用于实现滚动视图和表格视图,从而为用户提供更加友好的界面。

下面,我们来详细了解一下这两种控件以及在简书上的应用实例。

首先,我们来看看 UIScrollView。

UIScrollView 是一个可以容纳其他控件的滚动视图,用户可以在其中上下滚动以查看所有内容。

在 iOS 开发中,很多应用都会使用 UIScrollView 来实现类似的功能,比如朋友圈、微博等社交应用。

在简书上,UIScrollView 可以用于展示一篇文章中的所有评论,用户可以通过上下滚动查看所有评论内容。

接着,我们了解一下 UITableView。

UITableView 是一个用于显示表格视图的控件,它可以显示多行多列的数据。

在 iOS 开发中,UITableView 常用于实现表格形式的数据展示,比如系统设置、App Store 等应用。

在简书上,UITableView 可以用于展示文章的分类、标签等信息,用户可以通过表格视图快速切换查看不同分类或标签下的文章。

总之,UIScrollView 和 UITableView 在 iOS 开发中具有广泛的应用。

通过使用这两种控件,开发者可以为用户提供更加友好、直观的界面。

第1页共1页。

在项目开发时遇到一个问题

在项目开发时遇到一个问题

在项目开发时遇到一个问题,我在UIViewController上面直接创建了一个UIScrollerView,把UIScrollerView作为一个子视图添加到了UIViewController,又再UIScrollerView中添加了一个UISlider的组件,在手势滑动的过程中,很难滑动到UISlider这个控件,经常是滑动的时候UIScrollerView进行了滚动,而UISlider这个控件没有滑动,让人很抓狂。

上网具体去了解了一下UIScrollerView的详解,终于彻底明白了问题出在哪里下面引用一下前辈的总结,因为自己觉得没有他总结的详细UIScrollView重载了hitTest方法,当手指touch的时候,UIScrollView会拦截所有event,然后等待150ms,在这段时间内,如果没有手指没有移动,当时间结束时,UIScrollView 会发送tracking event到子视图上,并且自身不滑动。

在时间结束前,手指发生了移动,那么UIScrollView就会进行滑动,从而取消发送tracking。

看来是UIScrollView的问题。

直接拖动UISlider,此时touch时间在150ms以内,UIScrollView会认为是拖动自己,从而拦截了event,导致UISlider接受不到滑动的event。

但是只要按住UISlider一会再拖动,此时此时touch时间超过150ms,因此滑动的event会发送到UISlider上。

期间试过几种方法,只有一种可行,就是重写UIScrollView的hitTest方法:当滑动UISlider时,使UIScrollView不可滑动。

但是又出现了一个问题,我的UIScrollerView是直接继承了UIScrollerView,在UIViewController中是无法重写的UIScrollerView的hitTest方法的,所以需要重新创建一个view,继承UIScrollerView,然后再重写上述方法,然后再导入UIViewController 中就可以轻松实现了。

unity中scroll view的用法

unity中scroll view的用法

unity中scroll view的用法Unity中的ScrollView(滚动视图)是一个非常有用的UI元素,它允许用户在屏幕上滚动内容,无论内容有多大。

ScrollView提供了一种简洁的方法来显示大量的信息,而不必担心内容是否超出屏幕。

本文将逐步介绍Unity中ScrollView的用法,以帮助您了解如何在自己的项目中使用它。

我们将分为以下几个步骤进行讲解。

第一步:创建ScrollView要创建一个ScrollView,首先打开Unity编辑器,并在UI中创建一个空对象(Canvas)。

然后,右键单击Canvas并选择“UI→ScrollView”。

这将在Hierarchy面板中创建一个新的ScrollView对象,并在Scene视图中显示。

第二步:调整ScrollView的属性在Hierarchy面板中选择ScrollView对象,你将在Inspector面板中看到ScrollView的属性。

以下是一些您可能想要调整的属性:- Content:这是ScrollView中需要滚动的内容的直接子对象。

您可以将任何UI元素(如文本,图像或按钮)添加到Content对象中。

确保将Content对象设置为ScrollView对象的直接子对象,否则它将无法滚动。

- Vertical Scrollbar 和Horizontal Scrollbar:这些属性允许您选择ScrollView对象是否需要垂直或水平滚动条。

如果您希望用户可以垂直或水平滚动内容,则可以启用滚动条。

- Viewport:这是ScrollView的视口,只显示Content对象的部分。

如果Content对象太大而无法完全显示在屏幕上,则只会显示其中的一部分。

通过调整Viewport的大小,您可以控制显示Content的区域大小。

第三步:为ScrollView添加内容现在,您已经设置了ScrollView的属性,接下来需要向其中添加内容。

cocoa uiscrollview使用方法

cocoa uiscrollview使用方法

cocoa uiscrollview使用方法UIScrollView是iOS开发中常用的用户界面控件,它可以让用户在一个可滚动的视图区域内浏览内容。

在使用UIScrollView时,我们可以根据需要进行以下几个步骤:1. 初始化UIScrollView:我们可以使用Interface Builder创建一个UIScrollView 对象,或者通过编程方式创建一个UIScrollView对象。

接下来,我们需要设置UIScrollView的内容大小以及滚动范围。

2. 设置内容大小和滚动范围:UIScrollView的内容大小是指它可以滚动的区域的大小。

我们可以使用UIScrollView的contentSize属性来设置内容大小,它是一个CGSize类型的值,表示UIScrollView的内容的宽度和高度。

3. 添加子视图:UIScrollView可以包含多个子视图,比如图片、文本等。

我们可以通过将子视图添加到UIScrollView中来实现内容的展示。

4. 开启滚动:UIScrollView默认情况下是不能滚动的,我们需要将UIScrollView的scrollEnabled属性设置为YES,才能使其可滚动。

5. 缩放和滚动方向设置:UIScrollView还提供了缩放和滚动方向的设置。

我们可以设置UIScrollView的maximumZoomScale和minimumZoomScale属性来实现缩放功能。

滚动方向可以通过设置UIScrollView的scrollDirection属性来实现。

6. 监听滚动事件:UIScrollView提供了多个滚动事件的监听方法,比如scrollViewWillBeginDragging、scrollViewDidScroll等。

我们可以根据需要实现这些代理方法来处理相应的滚动事件。

总的来说,使用UIScrollView可以实现在一个可滚动的区域内展示大量内容,并且可以通过设置缩放、滚动方向以及监听滚动事件等方法来满足不同的需求。

ui实训心得体会

ui实训心得体会

ui实训心得体会在参加本次UI实训的过程中,我收获了许多宝贵的经验和知识。

以下是我对这次实训的心得体会。

首先,通过这次实训,我对UI的概念和设计原则有了更深入的理解。

在实践的过程中,我学会了如何将用户需求转化为具体的界面设计,并根据用户的使用习惯和心理预期来布局和设计各个模块。

我意识到用户体验是设计的核心,要通过合理的布局、清晰的导航和友好的交互来提升用户体验。

同时,我也学会了合理运用颜色、字体、图标等设计元素,使界面更加美观和易于使用。

其次,通过与团队成员的合作,我体会到了团队合作的重要性。

在设计过程中,我与团队成员进行了充分的沟通和协商,共同讨论和决定了各个模块的设计方案。

我们分工明确,各自发挥专长,最终达到了设计的目标。

我学到了如何与团队成员有效地沟通和协作,如何倾听和尊重他人的意见,这对我的职业发展和个人成长都具有重要意义。

此外,通过实际操作,我了解到了许多UI设计工具的使用方法和技巧。

比如,我学会了使用Sketch进行界面的绘制和编辑,学会了使用Adobe Photoshop和Illustrator进行图标和素材的制作。

这些工具不仅提高了我的工作效率,同时也帮助我更好地实现设计的想法。

最后,通过对课程的学习和实践的过程,我认识到要不断学习和提升自己的能力。

UI设计是一个与时俱进的领域,技术和趋势都在不断变化。

作为一名UI设计师,要保持学习的态度,跟上时代的步伐。

在实训的过程中,我积极主动地学习新的设计理念和技术,不断尝试和实践,提高自己的设计水平和创造力。

综上所述,通过这次UI实训,我不仅学到了UI设计的知识和技能,更重要的是,我明白了设计的核心是用户体验,团队合作是成功的关键,不断学习和提升自己是保持竞争力的必经之路。

我相信这些经验和体会将对我的职业发展和个人成长产生积极的影响。

swift uiscrollview 用法

swift uiscrollview 用法

swift uiscrollview 用法`UIScrollView` 是iOS 开发中常用的滚动视图控件,用于显示可滚动的内容。

以下是基本的`UIScrollView` 使用方法,以及一些常见的配置选项。

基本用法:1. 在Interface Builder 中添加UIScrollView:-在Storyboard 或XIB 文件中,拖拽一个UIScrollView 到你的视图控制器中。

2. 通过代码添加UIScrollView:-在Swift 代码中,可以通过以下方式创建UIScrollView:```swiftlet scrollView = UIScrollView()scrollView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)scrollView.contentSize = CGSize(width: 2 * view.frame.width, height: view.frame.height)view.addSubview(scrollView)```3. 添加内容视图:-将要滚动的内容添加到UIScrollView 中,可以是单个视图或者包含多个子视图的容器视图。

```swiftlet contentView = UIView()contentView.frame = CGRect(x: 0, y: 0, width: scrollView.contentSize.width, height: scrollView.contentSize.height)scrollView.addSubview(contentView)```常见配置选项:1. 滚动方向:- `scrollView.isDirectionalLockEnabled = true`:限制滚动方向。

2. 缩放:- `scrollView.minimumZoomScale` 和`scrollView.maximumZoomScale`:设置最小和最大缩放比例。

课题:解决UIScrollView 不能滚动的问题

课题:解决UIScrollView 不能滚动的问题
6.[scrollView setContentSize:CGSizeMake(self.frame.size.width, 980)];
7.// scrollView.delegate = self;
8.[self addSubview:scrollView];
解决UIScrollView不能滚动的问题
最常见的原因是
contentSize这个属性,比uiscrollview的frame要小,无需滚动,自然就滚动不了。
scrollenabled这个属性,标识着是否允许滚动,要言设成yes
另外还有一些比较隐蔽的原因.如果这个scrollView是在IB里面生成的话,还得手动设置它的contentSize,并且不能在initWithNibName:bundle:里面设置,因为The 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 theviewDidLoadmethod and perform your tasks there.
2.scrollView.pagingEnabled = YES;
3.[scrollView setScrollEnabled:YES];
4.[scrollView setShowsHorizontalScrollIndicator:NO];
5.[scrollView setShowsVerticalScrollIndicator:NO];

uiscrollview uitableview 简书

uiscrollview uitableview 简书

uiscrollview uitableview 简书UIScrollView与UITableView在简书的应用UIScrollView和UITableView是iOS开发中常用的控件之一,它们在简书这个社交网络应用中也被广泛使用。

本文将介绍UIScrollView和UITableView在简书应用中的使用场景和实现方式。

一、UIScrollView在简书中的运用UIScrollView是一个能够展示大量内容并能滚动查看的控件,它常用于展示多个页面、图片等内容。

在简书应用中,UIScrollView主要用于展示长文本内容,例如用户发表的文章,下面是UIScrollView在简书中的一些使用场景:1.1 文章详情页在简书的文章详情页中,UIScrollView常用于展示文章的正文内容。

由于一篇文章通常较长,使用UIScrollView能够实现内容的纵向滚动,让用户可以顺畅地浏览全部内容。

1.2 用户个人主页在用户的个人主页中,UIScrollView也经常被使用。

用户的个人主页通常包含了用户的基本信息、发表的文章列表等内容,这些内容一般都需要使用UIScrollView进行展示。

1.3 其他页面除了文章详情页和用户个人主页,UIScrollView还可以用于简书中的其他页面,例如关注列表、收藏列表等。

这些页面中的内容通常需要滑动展示,因此UIScrollView是不可或缺的。

二、UITableView在简书中的运用UITableView是iOS开发中用于展示列表数据的控件,它以行的形式展示数据,并支持下拉刷新、上拉加载更多等功能。

在简书应用中,UITableView的使用场景如下:2.1 文章列表页在简书的文章列表页中,UITableView常用于展示各个文章的摘要信息。

每个文章都占据一个UITableViewCell,包含标题、作者、发布时间等信息。

滑动UITableView可以快速浏览多篇文章,点击某个UITableViewCell可以进入文章详情页。

2024年ui实训心得与体会范文

2024年ui实训心得与体会范文

2024年ui实训心得与体会范文引言:作为一名大学生软件工程专业的学生,不仅仅要学习理论知识,还需要具备实际操作能力。

而UI实训课程正好可以帮助我们培养这种实际操作能力。

在2024年的UI实训课程中,我不断学习、实践,并从中获得了宝贵的经验和心得。

在这篇文章中,我将分享我在2024年UI实训中的心得与体会。

正文:一、前期准备在UI实训开始之前,我意识到必须做好充分的准备工作。

首先,我需要了解基本的UI设计原理和方法。

因此,我花了一些时间阅读相关的书籍和论文,参加了一些UI设计培训班,以提高自己的设计水平和能力。

其次,我还学习了一些流行的UI设计软件和工具,如Sketch、Photoshop等,以便能够更好地进行实际操作。

最后,我还研究了一些优秀的UI设计案例,以借鉴和学习他们的设计思路和创意。

二、团队合作在UI实训中,团队合作是非常重要的。

我所在的团队由5个人组成,每个人都有自己的优势和特长。

在实训的过程中,我们意识到只有团队合作才能将项目做得更好。

因此,我们制定了详细的合作计划,并分工合作。

每个人有自己的任务和责任,但同时也要积极与其他团队成员沟通和合作。

通过团队合作,我们能够更好地利用各自的优势,共同完成任务。

三、需求分析在UI实训中,需求分析是至关重要的一步。

只有深入了解用户需求,才能开发出符合用户需求的界面设计。

因此,在UI实训中,我将大部分时间都花在需求分析上。

通过与用户的交流和访谈,我了解到他们对界面设计的期望和要求。

同时,我也分析了竞品的界面设计,了解他们的优势和不足。

通过需求分析,我能够更好地把握用户需求,从而开发出更好的界面设计。

四、设计思路与创意在UI实训中,设计思路和创意是非常重要的。

一个好的设计思路和创意能够让界面设计更具吸引力和创新性。

因此,在UI实训中,我不仅注重掌握设计原则和方法,还注重培养自己的设计思维和创意能力。

同时,我还学习了一些常用的设计技巧和方法,如色彩搭配、排版等。

有关UIScrollViewzoom的一点心得

有关UIScrollViewzoom的一点心得

有关UIScrollViewzoom的一点心得实现UIScrollView的缩放,必须使maximumZoomScale(默认1.0)和minimumZoomScale(默认1.0)不同,并且需要在delegate中的viewForZoomingInScrollView: 方法中返回需要所放的view。

实现以上即可进行缩放。

要修改缩放过程中的一些行为,可以修该delegate中的scrollViewWillBeginZooming:withView: 和scrollViewDidZoom:(此方法为每次拖动时随时调用)和scrollViewDidEndZooming:withView:atScale:(此方法为每次放缩完毕时调用)的函数内容。

注意:viewForZoomingInScrollView方法返回的view是scrollview确定contentsize的view。

contentsize的大小与该view的frame.size 相同;在放缩的同时scrollview会自动设定zoomscale属性的大小,与每次放缩结束的scrollViewDidEndZooming:withView:atScale 中的scale相同。

每次放缩过程中,所放缩的view的bound不会改变而frame会改变(这同修改view的transform属性的效果相同)放缩会改变frame,改变view在父视图的位置,而不会改变bound大小。

推测放缩也是通过affinetransform进行改变。

所以对需要固定位置的view,需要在每次scrollViewDidZoom中修改view的位置,例如如下代码实现固定ImageView始终在整个content的居中位置:-(void)scrollViewDidZoom:(UIScrollView *)scrollView{CGFloat xcenter = scrollView.center.x , ycenter = scrollView.center.y;//目前contentsize的width是否大于原scrollview的contentsize,如果大于,设置imageview中心x点为contentsize的一半,以固定imageview在该contentsize中心。

Unity3D学习笔记——NGUI之UIScrollView

Unity3D学习笔记——NGUI之UIScrollView

前言:有的时候Panel会被截取,里面的内容就不能显示完整,所以需要为其添加 scroll view组件。

该文章出自【狗刨学习网】一:将Panel放进一个scroll view只需要简单的3步:1.首先在UI Root下创建三个Sprite并为其设置不同的贴图。

2.在UI Root下创建一个panel,然后在Scene界面中的panel上右键鼠标,在弹出的菜单中选择Attach -> Scroll View。

3.然后在Hierarchy中将创建的三个Sprite拖动到panel下。

3.通过拖动紫色按钮,即可改变scroll view的大小。

3.最后一步,添加拖动脚本。

添加拖动脚本之前,需要为控件添加一个随意的碰撞脚本,因为没有碰撞事件,是无法使用拖动脚本的。

可以为panel添加这个两个脚本,或是为panel里的每个item添加这个两个脚本:这里选择的是为每个item添加这两个脚本:右键Sprite对象 Attach——>Box Collier:右键Sprite对象 Attach——>Drag Scroll View拖动脚本:最后效果图如下:二:提示1.如果panel中有多个item时,想要将拖动事件添加到item上,必须为每一个item添加碰撞脚本和拖动脚本。

2.如果为panel添加碰撞组件和拖动组件的时候,一定要调节碰撞组件的大小,否则点击可能没有效果。

3.为panel或是item添加Drag Scroll View组件的时候,可以在Scene 中右键然后Attach -> Drag Scroll View即可。

4.UIPanel中有一个属性是Cliping,这个属性值建议选择Soft Clip这个功能还是很强大的,在显示范围之外的item将不显示,算是节省的内存资源吧。

三:Scroll View属性分析1.Content Origin:控制panle相对Scroll View的位置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UIScrollView(包括它的子类UITableView 和UICollectionView)是iOS 开发中最常用也是最有意思的UI 组件,大部分App 的核心界面都是基于三者之一或三者的组合实现。

UIScrollView 是UIKit 中为数不多能响应滑动手势的view,相比自己用UIPanGestureRecognizer 实现一些基于滑动手势的效果,用UIScrollView 的优势在于bounce 和decelerate 等特性可以让App 的用户体验与iOS 系统的用户体验保持一致。

本文通过一些实例讲解UIScrollView 的特性和实际使用中的经验。

UIScrollView 和Auto LayoutiPhone 5 刚出来的时候,大部分不支持横屏的App 都不需要做太多的适配工作,因为屏幕宽度没有变,table view 多个cell 也不需要加code。

但是在iPhone 6 和iPhone 6 Plus 发布以后,多分辨率适配终于不再是Android 开发的专利了。

于是,从iOS 6 起就存在的Auto Layout 终于有了用武之地。

关于Auto Layout 的基本用法不再赘述,可以参考Ray Wenderlich 上的教程(Part 2)。

但UIScrollView 在Auto Layout 是一个很特殊的view,对于UIScrollView 的subview 来说,它的leading/trailing/top/bottom space 是相对于UIScrollView 的contentSize 而不是bounds 来确定的,所以当你尝试用UIScrollView 和它subview 的leading/trailing/top/bottom 来互相决定大小的时候,就会出现「Has ambiguous scrollable content width/height」的warning。

正确的姿势是用UIScrollView 外部的view 或UIScrollView 本身的width/height 确定subview 的尺寸,进而确定contentSize。

因为UIScrollView 本身的leading/trailing/top/bottom 变得不好用,所以我习惯的做法是在UIScrollView 和它原来的subviews 之间增加一个content view,这样做的好处有:不会在storyboard 里留下error/warning为subview 提供leading/trailing/top/bottom,方便subview 的布局通过调整content view 的size(可以是constraint 的IBOutlet)来调整contentSize不需要hard code 与屏幕尺寸相关的代码更好地支持rotationSample 中的AutoLayout 演示了UIScrollView + Auto Layout 的例子。

UIScrollViewDelegate UIScrollViewDelegate 是UIScrollView 的delegate protocol,UIScrollView 有意思的功能都是通过它的delegate 方法实现的。

了解这些方法被触发的条件及调用的顺序对于使用UIScrollView 是很有必要的,本文主要讲拖动相关的效果,所以zoom 相关的方法跳过不提,拖动相关的delegate 方法按调用顺序分别是:-(void)scrollViewDidScroll:(UIScrollView* )scrollView这个方法在任何方式触发contentOffset 变化的时候都会被调用(包括用户拖动,减速过程,直接通过代码设置等),可以用于监控contentOffset 的变化,并根据当前的contentOffset 对其他view 做出随动调整。

-(void)scrollViewWillBeginDragging:(UISc rollView*)scrollView用户开始拖动scroll view 的时候被调用。

-(void)scrollViewWillEndDragging:(UIScr ollView*)scrollViewwithVelocity:(CGPoint) velocitytargetContentOffset:(inoutCGPoint *)targetContentOffset该方法从iOS 5 引入,在didEndDragging 前被调用,当willEndDragging 方法中velocity 为CGPointZero(结束拖动时两个方向都没有速度)时,didEndDragging 中的decelerate 为NO,即没有减速过程,willBeginDecelerating 和didEndDecelerating 也就不会被调用。

反之,当velocity 不为CGPointZero 时,scroll view 会以velocity 为初速度,减速直到targetContentOffset。

值得注意的是,这里的targetContentOffset 是个指针,没错,你可以改变减速运动的目的地,这在一些效果的实现时十分有用,实例章节中会具体提到它的用法,并和其他实现方式作比较。

-(void)scrollViewDidEndDragging:(UIScrol lView*)scrollViewwillDecelerate:(BOOL)de celerate在用户结束拖动后被调用,decelerate 为YES 时,结束拖动后会有减速过程。

注,在didEndDragging 之后,如果有减速过程,scroll view 的dragging 并不会立即置为NO,而是要等到减速结束之后,所以这个dragging 属性的实际语义更接近scrolling。

-(void)scrollViewWillBeginDecelerating:( UIScrollView*)scrollView减速动画开始前被调用。

-(void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView减速动画结束时被调用,这里有一种特殊情况:当一次减速动画尚未结束的时候再次drag scroll view,didEndDecelerating 不会被调用,并且这时scroll view 的dragging 和decelerating 属性都是YES。

新的dragging 如果有加速度,那么willBeginDecelerating 会再一次被调用,然后才是didEndDecelerating;如果没有加速度,虽然willBeginDecelerating 不会被调用,但前一次留下的didEndDecelerating 会被调用,所以连续快速滚动一个scroll view 时,delegate 方法被调用的顺序(不含didScroll)可能是这样的:scrollViewWillBeginDragging:scrollView WillEndDragging:withVelocity:targetConte ntOffset:scrollViewDidEndDragging:willDe celerate:scrollViewWillBeginDecelerating: scrollViewWillBeginDragging:scrollViewW illEndDragging:withVelocity:targetContent Offset:scrollViewDidEndDragging:willDecelerate:scrollViewWillBeginDecelerating:...s crollViewWillBeginDragging:scrollViewWil lEndDragging:withVelocity:targetContentO ffset:scrollViewDidEndDragging:willDecele rate:scrollViewWillBeginDecelerating:scrol lViewDidEndDecelerating:虽然很少有因为这个导致的bug,但是你需要知道这种很常见的用户操作会导致的中间状态。

例如你尝试在UITableViewDataSource 的tableView:cellForRowAtIndexPath: 方法中基于tableView 的dragging 和decelerating 属性判断是在用户拖拽还是减速过程中的话可能会误判(见例1)。

Sample 中的Delegate 简单输出了一些Log,你可以快速了解这些方法的调用顺序。

实例下面通过一些实例,更详细地演示和描述以上各delegate 方法的用途。

1. Table View 中图片加载逻辑的优化虽然这种优化方式在现在的机能和网络环境下可能看似不那么必要,但在我最初看到这个方法是的09 年(印象中是Tweetie 作者在08 年写的Blog,可能有误),遥想iPhone 3G/3GS 的机能,这个方法为多图的table view 的性能带来很大的提升,也成了我的秘密武器。

而现在,在移动网络环境下,你依然值得这么做来为用户节省流量。

先说一下原文的思路:当用户手动drag table view 的时候,会加载cell 中的图片;在用户快速滑动的减速过程中,不加载过程中cell 中的图片(但文字信息还是会被加载,只是减少减速过程中的网络开销和图片加载的开销);在减速结束后,加载所有可见cell 的图片(如果需要的话);问题1:前面提到,刚开始拖动的时候,dragging 为YES,decelerating 为NO;decelerate 过程中,dragging 和decelerating 都为YES;decelerate 未结束时开始下一次拖动,dragging 和decelerating 依然都为YES。

所以无法简单通过table view 的dragging 和decelerating 判断是在用户拖动还是减速过程。

解决这个问题很简单,添加一个变量如userDragging,在willBeginDragging 中设为YES,didEndDragging 中设为NO。

那么tableView: cellForRowAtIndexPath: 方法中,是否load 图片的逻辑就是:if(!erDragging&&tableView.decele rating){cell.imageView.image=nil;}else{//c odeforloadingimagefromnetworkordisk}问题2:这么做的话,decelerate 结束后,屏幕上的cell 都是不带图片的,解决这个问题也不难,你需要一个形如loadImageForVisibleCells 的方法,加载可见cell 的图片:-(void)loadImageForVisibleCells{NSArray *cells=[self.tableViewvisibleCells];for(GLI mageCell*cellincells){NSIndexPath*indexPath=[self.tableViewindexPathForCell:cell];[ selfsetupCell:cellwithIndexPath:indexPath] ;}}问题3:这个问题可能不容易被发现,在减速过程中如果用户开始新的拖动,当前屏幕的cell 并不会被加载(前文提到的调用顺序问题导致),而且问题 1 的方案并不能解决问题3,因为这些cell 已经在屏上,不会再次经过cellForRowAtIndexPath 方法。

相关文档
最新文档