iOS开发——UI篇&ScrollView详解
创建方式
1:StoryBoard/Xib
这里StoarBoard就不多说,直接拖就可以,说太多没意思,如果连这个都不会我只能先给你跪了!
2:代码:
CGRect bounds = [ [ UIScreen mainScreen ] applicationFrame ] ; UIScrollView* scrollView = [ [UIScrollView alloc ] initWithFrame:bounds ];
- 当你创建完滚动视图后,你可以将另一个视图的内容粘合到滚动视图的空白页上。这回创建一个滚动的内容窗口:
[ scrollView addSubview:myView];
UIScrollView使用的步骤
- 1.创建UIScrollView
- 2.将需要展示的内容添加到UIScrollView中
- 3.设置UIScrollView的滚动范围 (contentSize)
基本属性
scrollView不能滚动的几种情况
- 1.没有设置contentSize
- 2.scrollEnabled属性 = NO
- 3.userInteractionEnabled属性 = NO
self.scrollView.scrollEnabled = NO;
self.scrollView.userInteractionEnabled = NO;
enabled和userInteractionEnabled的区别
- enabled: 代表控件不可用
- userInteractionEnabled: 代表控件不可以和用户交互, 也就是不能响应用户的操作
注意: 如果想让UIScrollView进行滚动, 必须设置可以滚动的范围
注意: 如果想让UIScrollView进行滚动, 必须设置可以滚动的范围
设置scrollView的滚动范围为, frame的宽高 + 100
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width + 100, self.scrollView.frame.size.height + 100);
2.设置滚动范围
self.scrollView.contentSize = iv.image.size;
// 如何去掉滚动条
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.showsVerticalScrollIndicator = NO;
滚动条也是scrollView的子控件的一部分
滚动条可能在子控件的前面, 也可能在子控件的后面
正是因为这个原始, 所以以后在开发中不推荐大家通过subviews获取子控件的方式来操作子控件
[self.scrollView.subviews lastObject];
设置滚动条的样式
self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
默认情况下UIScrollView有一个回弹效果
只要设置了contentSize就有回弹效果
self.scrollView.bounces = YES;
设置默认是否有回弹效果 (默认就是没有设置contentSize的情况)
垂直方向可以回弹
下拉刷新
哪怕没有设置contentSize也可以有回弹效果
- self.scrollView.alwaysBounceVertical = YES;
- self.scrollView.alwaysBounceHorizontal = YES;
3.设置边距
self.scrollView.contentInset = UIEdgeInsetsMake(10, 20, 30, 40);
注意点:contentOffset移动的位置是一个临时的位置, 只要轻轻拖拽一下就会回到默认的位置
- CGFloat offsetX = self.sc.contentSize.width - self.sc.frame.size.width;
- CGFloat offsetY = self.sc.contentSize.height - self.sc.frame.size.height;
- [self.sc setContentOffset:CGPointMake(offsetX, offsetY) animated:YES];
-----------------------代理:----------------------------
如何监听一个控件的变化/状态
1. 首先需要查看该控件的头文件, 看它继承于谁
- 1.1如果继承于UIControl, 那么就可以通过addTarget来监听
- 1.2如果继承于UIView, 那么必须通过代理来监听
——————————————————————————————————————————————————————
代理协议的规律:
- 以控件的类名开头, 后面加上delegate
代理协议中的方法名的规律:
- 一般以控件名称去掉类前缀开头
代理协议中的方法参数的规律:
- 谁触发事件, 就将谁传递进来
如何监听UIScrollView的变化
- 1.成为UIScrollView的代理
- 2.遵守UIScrollView的协议
- 3.实现UIScrollView协议中的方法
代理作用:
- 当A对象想监听B对象的变化 , 那么可以让A成为B的代理
- 当B对象发生一些变化想通知A对象, 那么可以让A成为B的代理
/**************************代理方法***********************************/
#pragma mark - UIScrollViewDelegate
// 只要成为了UIScrollView的代理, 遵守代理协议, 实现协议中的方法
// 当UIScrollView发生一些变化的时候, 系统就会自动调用这些代理方法
// scrollViewDidScroll方法什么时候调用?
// 只要UIScrollView滚动了, 系统就会自动调用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { NSLog(@"%@", NSStringFromCGPoint(self.sc.contentOffset)); } // 只要用户准备开始拖拽了就会调用 - (void)scrollViewWillBeginDragging:(nonnull UIScrollView *)scrollView { }
// 用户已经结束拖拽, 代表用户已经松手了
// 系统调用了该方法并不代表着,UIScrollView已经停止滚动了
// 每次调用 停止拖拽方法时 ,系统都会传入一个当前是否有惯性的参数
// 我们可以判断该参数是否为YES, 如果是YES代表当前UIScrollView有惯性, 停止拖拽并不会停止滚动, 需要在停止减速方法中监听什么时候真正的停止
- (void)scrollViewDidEndDragging:(nonnull UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { NSLog(@"decelerate = %i", decelerate); if (decelerate == NO) { NSLog(@"没有惯性, 可以在当前方法监听UIScrollView是否停止滚动"); [self scrollViewDidEndDecelerating:scrollView]; }else{ NSLog(@"有惯性, 需要在减速结束方法中监听UIScrollView是否停止滚动"); } } // UIScrollView已经停止减速了 // 只有执行了这个方法才代表UIScrollView已经停止滚动了 - (void)scrollViewDidEndDecelerating:(nonnull UIScrollView *)scrollView { NSLog(@"UIScrollView停止滚动了"); }
结合前面MVC中的九宫格案例使用UIScrollView实现,并且设置滚动到对应的位置:
//6.设置shopsView的滚动范围
//添加滚动范围 ) { self.shopsView.contentSize = CGSizeMake(, (self.row + ) * (shopHeight + RowMargin)); //开始滚动 CGPoint offset = CGPointMake(, (self.row - ) * (shopHeight + RowMargin)); [self.shopsView setContentOffset:offset animated:YES]; }
注意:
如果想在UIScrollView停止滚动之后做一些操作, 有两种情况
- 1.没有惯性的情况: 只会调用 停止拖拽的方法, 不会调用停止减速的方法
- 2.有惯性的情况: 既会调用 停止拖拽的方法, 也会调用停止减速的方法
所以: 以后要判断UIScrollView是否停止滚动, 需要同时重写两个方法
- 2.1scrollViewDidEndDragging
- 2.2scrollViewDidEndDecelerating
缩放:
要想缩放图片分为两步
- 1.成为代理, 通过代理方法告诉UIScrollView要缩放哪一个子控件
- 2.设最大置子控件和最小的缩放比例
}
// 因为UISrollView中可能有多个子控件
// 那么UISrollView就搞不清楚到底要缩放哪一个子控件
// 想要缩放, 必须明确的告诉UISrollView要缩放哪一个控件
/**************************缩放代理方法***********************************/
#pragma mark - UIScrollViewDelegate
// 在此方法中告诉UISrollView要缩放哪一个控件 - (nullable UIView *)viewForZoomingInScrollView:(nonnull UIScrollView *)scrollView { return self.iv; } // 缩放的过程中调用 // 和上午学习的scrollViewDidScroll一样, 只要缩放一点点就会调用 - (void)scrollViewDidZoom:(nonnull UIScrollView *)scrollView { NSLog(@"%s", __func__); } // 缩放结束时调用 - (void)scrollViewDidEndZooming:(nonnull UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale { NSLog(@"%s", __func__); }
综合案例:
在iOS开发中UIScrollView使用最多的地方也就是结合pageControl实现页面的轮播,比如新特性或者广告还有一些就是关于图片浏览什么的。
1:在StoryBoard中搭建界面并且设置输出口
2:ViewDidiLoad方法中初始化子控件(UIImageView)设置相应的图片
// Do any additional setup after loading the view, typically from a nib.
CGFloat width = CGFloat height =
// 1.初始化子控件, 添加图片
; i < count; i++) { // 1.创建UIImageView UIImageView *iv = [[UIImageView alloc] init]; // 2.创建图片 UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:]]; // 3.设置每个UIImageView的frame iv.frame = CGRectMake(i * width, , width, height); // 按照宽度分页 iv.image = image; // 4.添加到父控件 [self.sc addSubview:iv]; }
3:设置UIScrollView和pageControl对应的属性
self.sc.showsHorizontalScrollIndicator = self.sc.showsVerticalScrollIndicator =
// 2.设置滚动范围
self.sc.contentSize = CGSizeMake(count * width, height); self.sc.bounces = NO; self.sc.pagingEnabled = YES;
// 3.监听PageControl的点击事件
[self.pageControl addTarget:self action:@selector(pageControlClick:) forControlEvents:UIControlEventValueChanged]; self.pageControl.numberOfPages = count;
//:设置pageControl对应每个点显示的图片,在这里因为是私有属性所以使用KVC来实现,正好用到了前面我们刚学到的KVC,如果不懂情查看相关文章()
4.通过KVC给UIPageControl的私有属性赋值, 设置自定义图片
[self.pageControl setValue:[UIImage imageNamed:@"current"] forKeyPath:@"_currentPageImage"]; [self.pageControl setValue:[UIImage imageNamed:@"other"] forKeyPath:@"_pageImage"];
5:设置代理并且实现代理方法,在代理方法里面实现UIScrollView的与PageControl同步滚动(使用四舍五入法处理中线变化的bug)
#pragma mark - UIScrollViewDelegate
// 只要滚动就会调用
- (void)scrollViewDidScroll:(nonnull UIScrollView *)scrollView { // 1.计算页码 // 当前页码 = 偏移位 / UIScrollView的宽度 CGFloat page = scrollView.contentOffset.x / scrollView.frame.size.width; int currnetPage = page + 0.5; // 2.修改页码 self.pageControl.currentPage = currnetPage; }
6:当我们有时候可能会的点击pageControl上面的点,所以有的时候也会希望能点击对应的点直接到对应的界面,可以直接使用UIScrollView的属性contentOfSet设置。
在StoryBoard中为pageControl设置一个Action并且实现一下代码
#pragma mark - 内部监听
- (IBAction)pageControlClick:(UIPageControl *)sender { self.sc.contentOffset = CGPointMake(sender.currentPage * self.sc.frame.size.width , ); }
7:既然是做一个完整的小项目,我们就要根据大部分App的需求,比如我们经常见到的广告会自动滚动,新特性同样也可以实现这个功能,而且在用户能够看完上面的内容的情况下自动到下一张效果会跟好,这样用户就不需要操作什么,下面就来实现一下自动滚动的效果,
这里使用的是NSTimer定时器
1)声明一个NSTimer属性
// 注意:NSTimer应该是weak
// 为什么NSTimer应该是weak, 因为只要创建一个NSTimer对象, 该对象就会被主线程强引用
@property (weak, nonatomic) NSTimer *timer;
2)定义一个公共开启定时器的方法,这里使用的是NSRunLoop实现一个常见的bug(用户做其他操作图片还是同意滚动),关于NSRunLoop后面的关于多线程的文章中将会详细介绍。
#pragma mark - 定时器相关
- (void)startTimer { // 打开定时器 self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextPage:) userInfo:@"lnj" repeats:YES]; // 主线程在处理其它事件的时候, 分一点时间来处理NSTimer // 1.0 0.1 [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; }
在ViewDidLoad中调用这个方法,是的应用程序进来就会实现滚动,
NStimer实现定时的时候会自定定时的调用我们下面的方法实现页面的跳转:
// 切换到下一页
- (void)nextPage:(NSTimer *)timer { // NSLog(@"%@", timer.userInfo); // 1.获取下一页的页码 NSUInteger page = self.pageControl.currentPage + ; // 2.判断页码是否越界 if (page >= IMAGE_COUNT) { // 如果越界就回到第0页 self.pageControl.currentPage = ; }else { // 如果没有越界, 就进入到下一页 self.pageControl.currentPage = page; } [self pageControlClick:self.pageControl]; }
3)同样实现一个关闭定时器的公共方法。
- (void)stopTimer { // 关掉定时器 #warning 注意:NSTimer是一次性的, 只要invalidate之后就不能使用了 // 只要调用invalidate方法, 系统就会将NSTimer从主线程移除, 并且销毁NSTimer对象 NSLog(@"销毁前: %@", self.timer); [self.timer invalidate]; self.timer = nil; NSLog(@"销毁后: %@", self.timer); }
4)最后有两个地方需要注意的是,可能甚至一定回去对界面有一些相应的操作,而我们要做的就是在用户操作的同时实现图片的滚动不受任何影响除非是对UIScrolView做一些操作,所以我们要根据用户相应的操作实现定时器的关闭与打开,这里我只是在拖拽或者触摸的时候实现这个功能,
// 开始拖拽 - (void)scrollViewWillBeginDragging:(nonnull UIScrollView *)scrollView { // NSLog(@"%s", __func__); [self stopTimer]; } // 结束拖拽 - (void)scrollViewDidEndDragging:(nonnull UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { // NSLog(@"%s", __func__); [self startTimer]; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self stopTimer]; } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [self startTimer]; }
最后的效果
在后面的文章中我们会讲到三个UI中最难(其实也不难,只是相对)的控件:UITableView,UICollection,UIStackView,其中后面两个可以非常简单的实现上面的功能,几行代码就搞定。
属性与方法总结:
属性:
// 监控目前滚动的位置(默认CGPointZero) CGPoint contentOffset; - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated; // 滚动范围的大小(默认CGSizeZero) CGSize contentSize; // 视图在scrollView中的位置(UIEdgeInsetsZero) UIEdgeInsets contentInset; // 设置协议 id<UIScrollViewDelegate> delegate; // 指定控件是否只能在一个方向上滚动(默认为NO) BOOL directionalLockEnabled; // 控制控件遇到边框是否反弹(默认为YES) BOOL bounces; // 控制垂直方向遇到边框是否反弹(默认为NO,如果为YES,bounces也是YES) BOOL alwaysBounceVertical; // 控制水平方向遇到边框是否反弹(默认为NO,如果为YES,bounces也是YES) BOOL alwaysBounceHorizontal; // 控制控件是否整页翻动(默认为NO) BOOL pagingEnabled; // 控制控件是否能滚动 BOOL scrollEnabled; // 控制是否显示水平方向的滚动条 BOOL showsHorizontalScrollIndicator; // 控制是否显示垂直方向的滚动条 BOOL showsVerticalScrollIndicator; // 指定滚动条在scrollerView中的位置 UIEdgeInsets scrollIndicatorInsets; // 设定滚动条的样式 UIScrollViewIndicatorStyle indicatorStyle;
UIScrollViewDelegate详解
//scrollView滚动时,就调用该方法。任何offset值改变都调用该方法。即滚动过程中,调用多次 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidScroll"); CGPoint point=scrollView.contentOffset; NSLog(@"%f,%f",point.x,point.y); // 从中可以读取contentOffset属性以确定其滚动到的位置。 // 注意:当ContentSize属性小于Frame时,将不会出发滚动 } // 当scrollView缩放时,调用该方法。在缩放过程中,回多次调用 - (void)scrollViewDidZoom:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidScroll"); float value=scrollView.zoomScale; NSLog(@"%f",value); } // 当开始滚动视图时,执行该方法。一次有效滑动(开始滑动,滑动一小段距离,只要手指不松开,只算一次滑动),只执行一次。 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ NSLog(@"scrollViewWillBeginDragging"); } // 滑动scrollView,并且手指离开时执行。一次有效滑动,只执行一次。 // 当pagingEnabled属性为YES时,不调用,该方法 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{ NSLog(@"scrollViewWillEndDragging"); } // 滑动视图,当手指离开屏幕那一霎那,调用该方法。一次有效滑动,只执行一次。 // decelerate,指代,当我们手指离开那一瞬后,视图是否还将继续向前滚动(一段距离),经过测试,decelerate=YES - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ NSLog(@"scrollViewDidEndDragging"); if (decelerate) { NSLog(@"decelerate"); }else{ NSLog(@"no decelerate"); } CGPoint point=scrollView.contentOffset; NSLog(@"%f,%f",point.x,point.y); } // 滑动减速时调用该方法。 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{ NSLog(@"scrollViewWillBeginDecelerating"); // 该方法在scrollViewDidEndDragging方法之后。 } // 滚动视图减速完成,滚动将停止时,调用该方法。一次有效滑动,只执行一次。 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidEndDecelerating"); [_scrollView setContentOffset:CGPointMake(, ) animated:YES]; } // 当滚动视图动画完成后,调用该方法,如果没有动画,那么该方法将不被调用 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidEndScrollingAnimation"); // 有效的动画方法为: // - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated 方法 // - (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated 方法 } // 返回将要缩放的UIView对象。要执行多次 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{ NSLog(@"viewForZoomingInScrollView"); return self.imgView; } // 当将要开始缩放时,执行该方法。一次有效缩放,就只执行一次。 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view{ NSLog(@"scrollViewWillBeginZooming"); } // 当缩放结束后,并且缩放大小回到minimumZoomScale与maximumZoomScale之间后(我们也许会超出缩放范围),调用该方法。 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{ NSLog(@"scrollViewDidEndZooming"); } // 指示当用户点击状态栏后,滚动视图是否能够滚动到顶部。需要设置滚动视图的属性:_scrollView.scrollsToTop=YES; - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView{ return YES; } // 当滚动视图滚动到最顶端后,执行该方法 - (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidScrollToTop"); }
判断uiscrollview是向上滚动还是向下滚动
int _lastPosition; //A variable define in headfile
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ int currentPostion = scrollView.contentOffset.y; ) { _lastPosition = currentPostion; NSLog(@"ScrollUp now"); } ) { _lastPosition = currentPostion; NSLog(@"ScrollDown now"); } } // 25 可以是任意数字,可根据自己的需要来设定。 // 升级版:到达顶部或底部时不会反弹 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { int currentPostion = scrollView.contentOffset.y; && currentPostion > ) { //这个地方加上 currentPostion > 0 即可) _lastPosition = currentPostion; NSLog(@"ScrollUp now"); } ) && (currentPostion <= scrollView.contentSize.height-scrollView.bounds.size.height-) ){ _lastPosition = currentPostion; NSLog(@"ScrollDown now"); } }
iOS开发——UI篇&ScrollView详解的更多相关文章
- iOS开发UI篇—UIScrollView控件实现图片缩放功能
iOS开发UI篇—UIScrollView控件实现图片缩放功能 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对 ...
- iOS开发UI篇—UIScrollView控件介绍
iOS开发UI篇—UIScrollView控件介绍 一.知识点简单介绍 1.UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 ...
- iOS开发UI篇—UIScrollView控件实现图片轮播
iOS开发UI篇—UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播 二.实现代码 storyboard中布局 代码: #import "YYV ...
- iOS开发UI篇—无限轮播(循环利用)
iOS开发UI篇—无限轮播(循环利用) 一.无限轮播 1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollV ...
- iOS开发UI篇—无限轮播(功能完善)
iOS开发UI篇—无限轮播(功能完善) 一.自动滚动 添加并设置一个定时器,每个2.0秒,就跳转到下一条. 获取当前正在展示的位置. [self addNSTimer]; } -(void)addNS ...
- iOS 开发之照片框架详解(2)
一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...
- 【转】 iOS开发UI篇—UIScrollView控件实现图片轮播
原文:http://www.cnblogs.com/wendingding/p/3763527.html iOS开发UI篇—UIScrollView控件实现图片轮播 一.实现效果 实现图片的自动轮播 ...
- iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)
本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...
- iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)
转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...
随机推荐
- hdu 5335 Walk Out(bfs+斜行递推) 2015 Multi-University Training Contest 4
题意—— 一个n*m的地图,从左上角走到右下角. 这个地图是一个01串,要求我们行走的路径形成的01串最小. 注意,串中最左端的0全部可以忽略,除非是一个0串,此时输出0. 例: 3 3 001 11 ...
- JAVA深复制(深克隆)与浅复制(浅克隆)
1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. 1. ...
- linux命令——磁盘命令mkdir
一.介绍 mkdir 命令用于创建文件夹或目录(类似dos下的md命令),要求创建目录的用户在当前目录中具有写权限, 并且指定目录名不能是当前目录中已有的目录或文件名称.名称区分大小写. 二.用法及参 ...
- LightOJ 1038-Race to 1 Again(概率dp)
题意: 给你一个数n每一步这个数可以变为他的因子,直到这个数变为1,求n变到1的期望步数. 分析: dp[i],表示i变为1的期望步数,dp[1]=0,dp[n]是答案. dp[i]=sum(dp[j ...
- [转]Oracle 阳历转农历
CREATE TABLE SolarData ( YearID INTEGER NOT NULL, -- 农历年 DATA ) NOT NULL, -- 农历年对应的16进制数 DataInt INT ...
- 【转】Ofbiz学习经验谈
不可否认,OFBiz这个开源的系统功能是非常强大的,涉及到的东西太多了,其实对我们现在而言,最有用的只有这么几个:实体引擎.服务引擎.WebTools.用户权限管理.最先要提醒各位的是,在配置一个OF ...
- VSim [a Racing-simulator by Vell001]
VSim [a racing-simulator by vell001] This is my first project about Racing. I am a Chinese with bad ...
- <Chapter 2>2-2-2.开发Python应用(Developing a Python App)
对App Engine来讲最简单的Python应用是一个有两个文件的简单目录:一个称为app.yaml的配置文件,一个用于请求处理器的Python代码文件.包含app.yaml文件的这个目录就是这个应 ...
- 对ArrayList 进行深拷贝
ArrayList arr = new ArrayList(); arr.Add()); arr.Add()); arr.Add()); ArrayList arr2 = new ArrayList( ...
- Codeforces Round #364 (Div.2) C:They Are Everywhere(双指针/尺取法)
题目链接: http://codeforces.com/contest/701/problem/C 题意: 给出一个长度为n的字符串,要我们找出最小的子字符串包含所有的不同字符. 分析: 1.尺取法, ...