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 开 ...
随机推荐
- C#主线程等待子线程运行结束
佐左佑右 原文 C#主线程等待子线程运行结束 由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然 ...
- Java进程占用CPU资源过多分析
问题描述: 生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高. 问题分析: 1,程序属于CPU密集型,和开发沟通 ...
- Tsinsen A1303. tree(伍一鸣) (LCT+处理标记)
[题目链接] http://www.tsinsen.com/A1303 [题意] 给定一棵树,提供树上路径乘/加一个数,加边断边,查询路径和的操作. [思路] LCT+传标 一次dfs构造LCT. L ...
- C语言——递归练习
1.炮弹一样的球状物体,能够堆积成一个金字塔,在顶端有一个炮弹,它坐落在一个4个炮弹组成的层面上,而这4个炮弹又坐落在一个9个炮弹组成的层面上,以此类推.写一个递归函数CannonBall,这个函数把 ...
- Ext列表展现--普通排序sortable--全局排序remoteSort(EXTJS 全局排序问题)
关于Ext的排序问题,一般涉及到两种方式. A.一种是默认的客户端排序机制,对当前页进行排序.sortable 这种排序模式不用多说,是人都会: 1.可以在Ext.grid.ColumnModel列模 ...
- 内核源码分析之软中断(基于3.16-rc4)
1.和软中断相关的数据结构: softing_vec数组(kernel/softirq.c) static struct softirq_action softirq_vec[NR_SOFTIRQS] ...
- 【JAVA版】Storm程序整合Kafka、Mongodb示例及部署
一.环境 一台Centos6.5主机 Mongo 3.0 Kafka_2.11-0.8.2.1 Storm-0.9.5 Zookeeper-3.4.6 java 1.7 (后因在mac上打包的jar由 ...
- CDH5.5.1 安装Spark ON Yarn环境
CDH对我们已经封装了,我们如果需要Spark on Yarn,只需要yum安装几个包就可以了. 前面的文章我有写过如果搭建自己内网的CDH Yum服务器,请参考<CDH 5.5.1 Yum源服 ...
- .NET中获取字符串的MD5码
C# 代码: 导入命名空间(需要在Web页面的代码页中引用) using System.Web.Security; 获取MD5码 string Password = FormsAuthenticati ...
- android 拍照或者图库选择 压缩后 图片 上传
通过拍照或者从相册里选择图片通过压缩并上传时很多应用的常用功能,记录一下实现过程 一:创建个临时文件夹用于保存压缩后需要上传的图片 /** * path:存放图片目录路径 */ private Str ...