iOS开发相册功能的实现即滚动视图的实现(UI阶段)

现如今的生活中手机相册,微信朋友圈等滚动视图无处不在,
此外还有很多关于滚动视图的APP也天天出现在我们的生活中,今天就来简单介绍一下滚动视图的方法和实现,即相册的功能实现.

首先创建相册工程:

C1E10722-0302-4AEC-98DD-F4FA963B69E2.png

在AppDelegate.m中初始化Window并设置视图控制器:

初始化Window:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen  mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
设置根视图控制器:
ViewController *vc = [[ViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];
self.window.rootViewController = nav;
设置透明度:
nav.navigationBar.translucent = NO;
释放:
[vc release];
[nav release];
[_window release];

创建滚动视图的详情界面:

5E3996B4-5E71-4AAD-9CCD-5227E951EA15.png

基础工作做完在ViewController.m中添加图片信息:

因为图片的宽和高用到很多,所以在文件中宏定义图片的宽和高,以简化我们的代码量:
  #define ScreenWidte [UIScreen  mainScreen].bounds.size.width
  #define ScreenHeight [UIScreen mainScreen].bounds.size.height
引入滚动视图详情界面头文件并定义滚动视图的属性:
9FE4047C-0D28-449F-A934-38E788E9BBC0.png

释放:
@implementation ViewController
- (void)dealloc
{
[_scrollView release];
[super dealloc];
}

定义相册的一些基本属性(颜色,titie等)
  - (void)viewDidLoad {
[super viewDidLoad];

 self.navigationItem.title = @"相册";
self.navigationController.navigationBar.barTintColor = [UIColor blackColor];

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
}

将已有的图片素材拖入工程中,在loadview中定义图片的大小并循环加入图片:

A1555ABE-1DB9-4C93-8BF0-1B26C02663CC.png

在loadview中初始化图片:

- (void)loadView
{
[super loadView];
self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidte, ScreenHeight - 64)];
self.scrollView.contentSize = CGSizeMake(ScreenWidte, 330 * 3);
[self.view addSubview:_scrollView];
[_scrollView release];

紧接着在loadview中循环添加图片:

  //设置图片:(以下为竖屏模式下的滚动相册)
for (NSInteger i = 1; i <= 6; i++) {                
    UIImageView *imageView = [[UIImageView alloc] init];
    if (i % 2 != 0) {
        imageView.frame = CGRectMake(0,330 * (i / 2) , ScreenWidte / 2.0, 330);
                                                #以6张图片为例,竖屏滚动
    }
    else
    {
        imageView.frame = CGRectMake(ScreenWidte / 2.0, 330 * ((i - 1) / 2), ScreenWidte / 2.0, 330);
    }
    imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%ld.JPG", i]];
    //添加tag值(以便后面找到点击的图片):
    imageView.tag = 1000 + i;

    //打开用户交互:
    imageView.userInteractionEnabled = YES;

    //添加轻拍手势:
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapImageView:)];

   //添加视图并释放:
    [imageView addGestureRecognizer:tapGesture];
    [tapGesture release];
    [self.scrollView addSubview:imageView];
    [imageView release];
    
    
}
}      #与上一步的load view的{对应

利用滚动视图的方法获取到轻拍图片并利用协议传值完成界面之间的跳转:

 - (void)didTapImageView:(UITapGestureRecognizer *)tap
{
//获取到轻拍的图片:
NSInteger number = tap.view.tag - 1000;
NSLog(@"%ld", number);

//跳转界面:
DetailViewController *dVC = [[DetailViewController alloc] init];
dVC.num = number;
[self.navigationController pushViewController:dVC animated:YES];
//[dVC release];
}

以上都是一些界面实现的基本步骤,最重要的就是在详情界面中添加滚动视图的一些方法(利用偏移量来进行判断滚到第几张)

同样宏定义图片的宽和高,并签订滚动视图协议

B2A33805-6D70-4DC6-9AC8-252EA66C887B.png
自动释放:
-(void)dealloc
{
[_scrollView release];
[super dealloc];
}

在DetailViewController.h中设置滚动视图偏移量的属性(即现在是第几张图片):

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController
@property(nonatomic, assign)NSInteger num;
@end

在viewDidLoad中利用偏移量的改变完成滚动视图的实现:

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
设置滚动视图偏移量:
self.scrollView.contentOffset = CGPointMake(ScreenWidte * (self.num - 1), 0);
显示当前第几张:
NSString *title = [NSString stringWithFormat:@"第%ld张",self.num];
[self.navigationItem setTitle:title];          (显示title便于观察变化)
为了双击图片放大返回时卡顿在第二界面设置一个按钮用来返回原界面:
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"add_icon@2x"] style:UIBarButtonItemStylePlain target:self action:@selector(didClickGoBackButton:)];
}  #对应上面DidLoad的{
按钮的点击方法:
- (void)didClickGoBackButton:(UIBarButtonItem *)button
 {
[self.navigationController popViewControllerAnimated:YES];
 }

在load view中初始化视图坐标,并利用循环创建每一个视图的坐标(这一步比较麻烦,要仔细理解)

-(void)loadView
{
[super loadView];
   //初始化坐标
self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidte, ScreenHeight - 64)];
self.scrollView.contentSize = CGSizeMake(ScreenWidte * 6, ScreenHeight - 64);

//设置代理人(用于协议传值):
self.scrollView.delegate = self;

 //  设置整页翻动
self.scrollView.pagingEnabled = YES;

//添加滚动视图
[self.view addSubview:_scrollView];
[_scrollView release];

//循环创建坐标:
for (NSInteger i = 1; i <=6; i++) {
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(ScreenWidte * (i - 1), 0, ScreenWidte, ScreenHeight - 64)];
    imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%ld.JPG", i]];
    [self.scrollView addSubview:imageView];
    [imageView release];
}

}

滚动视图实现方法:

-(void)scrollViewDidEndDecelerating:(UIScrollView 
*)scrollView
 {
//取偏移量:
NSInteger pageNumber = (long)(scrollView.contentOffset.x / ScreenWidte);
self.navigationItem.title = [NSString stringWithFormat:@"第%ld张", pageNumber + 1];
}

运行就能得到相册的效果:

84AC391F-AB38-47DA-8A6C-AA75E4276C00.png

滑动图片:

![211A1333-7C71-45DB-8A63-D45D032413CB.png](http://upload-images.jianshu.io/upload_images/1714255-2472bf5e9089fbd1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

双击放大其中一个图片:

13ABB910-AC7B-402B-9FAF-DD81CFCB11A1.png

点击左侧加号按钮返回到相册界面:

CAEC51DF-BE8A-4A90-93D4-7BD07EA97929.png

BAD67B03-A2E4-43F2-BFC4-2559D323D479.png

滚动视图的功能以后学习生活中会用到很多,加油吧,少年!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容