亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS開發教程之自定制圖片瀏覽器

2019-10-21 18:42:35
字體:
來源:轉載
供稿:網友

前言

圖片瀏覽器大家應該都用過,這方面的第三方也有很多,不過有時候第三方會跟我們的需求有一些出入,這就需要我們要么對第三方進行修改要么自己重新定制。我是比較喜歡自己重新定制的,在這給大家簡單介紹一下我定制的圖片瀏覽器,算是給大家提供一個思路,可以在此基礎上進行修改完善。

iOS開發教程,圖片瀏覽器,ios,自定義瀏覽器

實現原理

通過彈出UIViewController的形式來展示圖片,使用UICollectionView并添加手勢來實現圖片瀏覽時圖片的間隔。

首先創建一個繼承于UIViewController的控制器,來作為圖片瀏覽器的控制器,并實現相應的代碼如下:

示例代碼

#import <UIKit/UIKit.h>#import "RHPhotoBrowser.h"@interface RHPhotoBrowserController : UIViewController- (instancetype)initWithType:(RHPhotoSourceType)type imageArr:(NSArray *)imageArr selectIndex:(NSInteger)selectIndex;@end
#import "RHPhotoBrowserController.h"#import "RHPhotoBrowserCell.h"#define Cell_PhotoBrowser @"Cell_PhotoBrowser"#define PhotoSpace   10  // 圖片間距@interface RHPhotoBrowserController () <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>@property (nonatomic, strong) UICollectionView * collection;@property (nonatomic, strong) UIPageControl * pageControl;@property (nonatomic, strong) NSMutableArray * dataArr;@property (nonatomic, assign) RHPhotoSourceType type;@property (nonatomic, assign) NSInteger selectIndex;@property (nonatomic, assign) CGFloat panCenterX;@property (nonatomic, assign) CGFloat startOffsetX;@property (nonatomic, assign) CGFloat offsetX;@property (nonatomic, assign) CGFloat panX;@end@implementation RHPhotoBrowserController- (instancetype)initWithType:(RHPhotoSourceType)type imageArr:(NSArray *)imageArr selectIndex:(NSInteger)selectIndex { self = [super init]; if (self) {  [self.dataArr removeAllObjects];  [self.dataArr addObjectsFromArray:imageArr];  _type = type;  _selectIndex = selectIndex; } return self;}- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self addSubviews]; [self makeConstraintsForUI];}#pragma mark - add subviews- (void)addSubviews { self.view.backgroundColor = [UIColor blackColor]; [self.view addSubview:self.collection]; [self.view addSubview:self.pageControl];}- (void)makeConstraintsForUI { [_collection mas_makeConstraints:^(MASConstraintMaker *make) {  make.top.left.right.bottom.mas_equalTo(0); }]; [_pageControl mas_makeConstraints:^(MASConstraintMaker *make) {  make.left.right.mas_equalTo(0);  make.bottom.mas_equalTo(-SS(50));  make.height.mas_equalTo(20); }]; [self performSelector:@selector(setCollectionContentOffset) withObject:nil afterDelay:0.1];}- (void)setCollectionContentOffset { RHWeakSelf; dispatch_async(dispatch_get_main_queue(), ^{  [weakSelf.collection setContentOffset:CGPointMake((Screen_Width + PhotoSpace) * _selectIndex, 0) animated:NO];  weakSelf.pageControl.numberOfPages = weakSelf.dataArr.count;  weakSelf.pageControl.currentPage = _selectIndex; }); _startOffsetX = _collection.contentOffset.x;}#pragma mark - GestureRecognizer event- (void)panCollection:(UIPanGestureRecognizer *)pan { _panCenterX = [pan translationInView:self.collection].x; if (pan.state == UIGestureRecognizerStateBegan) {  _startOffsetX = _collection.contentOffset.x;  _offsetX = 0;  _panX = 0; } if (_selectIndex == 0) {  if (_panCenterX > 0) {   CGFloat s = (Screen_Width - _panCenterX) / Screen_Width;   _offsetX += (_panCenterX - _panX) * s;   _panX = _panCenterX;   [self.collection setContentOffset:CGPointMake(-_offsetX, 0) animated:NO];  } else {   if (self.dataArr.count == 1) {    CGFloat s = (Screen_Width + _panCenterX) / Screen_Width;    _offsetX += (_panCenterX - _panX) * s;    _panX = _panCenterX;    [self.collection setContentOffset:CGPointMake(-_offsetX, 0) animated:NO];   } else {    [self.collection setContentOffset:CGPointMake(_startOffsetX - _panCenterX, 0) animated:NO];   }  } } else if (_selectIndex == self.dataArr.count - 1) {  if (_panCenterX < 0) {   CGFloat s = (Screen_Width + _panCenterX) / Screen_Width;   _offsetX += (_panCenterX - _panX) * s;   _panX = _panCenterX;   [self.collection setContentOffset:CGPointMake(_startOffsetX - _offsetX, 0) animated:NO];  } else {   [self.collection setContentOffset:CGPointMake(_startOffsetX - _panCenterX, 0) animated:NO];  } } else {  [self.collection setContentOffset:CGPointMake(_startOffsetX - _panCenterX, 0) animated:NO]; } if (pan.state == UIGestureRecognizerStateEnded) {    if ([self absoluteValue:_panCenterX] > Screen_Width/3) {   if (_panCenterX < 0) {        _selectIndex += 1;   } else {    _selectIndex -= 1;   }   if (_selectIndex == self.dataArr.count) {        _selectIndex = self.dataArr.count - 1;   } else if (_selectIndex == -1) {        _selectIndex = 0;   }   [self.collection setContentOffset:CGPointMake((Screen_Width + PhotoSpace) * _selectIndex, 0) animated:YES];   self.pageControl.currentPage = _selectIndex;  } else {      [self.collection setContentOffset:CGPointMake(_startOffsetX, 0) animated:YES];  } }}- (void)swipeCollection:(UISwipeGestureRecognizer *)swipe {  if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) {    _selectIndex += 1; } else if (swipe.direction == UISwipeGestureRecognizerDirectionRight) {    _selectIndex -= 1; } if (_selectIndex == self.dataArr.count) {    _selectIndex = self.dataArr.count - 1; } else if (_selectIndex == -1) {    _selectIndex = 0; } self.pageControl.currentPage = _selectIndex; [self.collection setContentOffset:CGPointMake((Screen_Width + PhotoSpace) * _selectIndex, 0) animated:YES];}// 返回value的絕對值- (CGFloat)absoluteValue:(CGFloat)value {  if (value < 0) {    return -value; } return value;}#pragma mark - collection delegate- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {  return self.dataArr.count;}- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {  RHPhotoBrowserCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:Cell_PhotoBrowser forIndexPath:indexPath]; if (indexPath.row < self.dataArr.count) {    if (_type == RHPhotoSourceTypeImage) {      UIImage * image = [self.dataArr objectAtIndex:indexPath.row];   [cell configCellWithImage:image];  } else if (_type == RHPhotoSourceTypeUrl) {      NSString * url = [self.dataArr objectAtIndex:indexPath.row];   [cell configCellWithUrl:url];  } else if (_type == RHPhotoSourceTypeFilePath) {      NSString * filePath = [self.dataArr objectAtIndex:indexPath.row];   [cell configCellWithFilePath:filePath];  } else if (_type == RHPhotoSourceTypeFileName) {      NSString * fileName = [self.dataArr objectAtIndex:indexPath.row];   [cell configCellWithFileName:fileName];  } } return cell;}- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {  return CGSizeMake(Screen_Width, Screen_Height);}- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {  return PhotoSpace;}- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {  return 0;}- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {  [self dismissViewControllerAnimated:YES completion:nil];}#pragma mark - setter and getter- (UICollectionView *)collection {  if (!_collection) {    UICollectionViewFlowLayout * layout = [[UICollectionViewFlowLayout alloc] init];  layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;    UICollectionView * cv = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];  cv.backgroundColor = [UIColor blackColor];  cv.delegate = self;  cv.dataSource = self;  cv.showsHorizontalScrollIndicator = NO;  [cv registerClass:[RHPhotoBrowserCell class] forCellWithReuseIdentifier:Cell_PhotoBrowser];  UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panCollection:)];  [cv addGestureRecognizer:pan];  UISwipeGestureRecognizer * swipeL = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeCollection:)];  swipeL.direction = UISwipeGestureRecognizerDirectionLeft;  [cv addGestureRecognizer:swipeL];  UISwipeGestureRecognizer * swipeR = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeCollection:)];  swipeR.direction = UISwipeGestureRecognizerDirectionRight;  [cv addGestureRecognizer:swipeR];  _collection = cv; } return _collection;}- (UIPageControl *)pageControl {  if (!_pageControl) {    UIPageControl * pageControl = [[UIPageControl alloc] init];  pageControl.pageIndicatorTintColor = [[UIColor lightGrayColor] colorWithAlphaComponent:0.9];  pageControl.currentPageIndicatorTintColor = [UIColor whiteColor];  pageControl.userInteractionEnabled = NO;  _pageControl = pageControl; } return _pageControl;}- (NSMutableArray *)dataArr {  if (!_dataArr) {    _dataArr = [NSMutableArray array]; } return _dataArr;}@end

其實到此基本已經結束了,大家實現一個相對應的cell就可以了。使用時直接通過外漏的方法創建該控制器對象并彈出該控制器即可。

為了更加方便的調用,我又增加了一個NSObject的類來控制以上控制器的調用。如下:

#import <Foundation/Foundation.h>typedef NS_ENUM(NSUInteger, RHPhotoSourceType) { RHPhotoSourceTypeImage  = 0, RHPhotoSourceTypeUrl  = 1, RHPhotoSourceTypeFilePath = 2, RHPhotoSourceTypeFileName = 3};@interface RHPhotoBrowser : NSObject+ (RHPhotoBrowser *)shared;- (void)browseImageWithType:(RHPhotoSourceType)type imageArr:(NSArray *)imageArr selectIndex:(NSInteger)selectIndex;@end
#import "RHPhotoBrowser.h"#import "RHPhotoBrowserController.h"@implementation RHPhotoBrowser+ (RHPhotoBrowser *)shared { static RHPhotoBrowser * helper = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{   helper = [[RHPhotoBrowser alloc] init]; }); return helper;}- (void)browseImageWithType:(RHPhotoSourceType)type imageArr:(NSArray *)imageArr selectIndex:(NSInteger)selectIndex { if (selectIndex > imageArr.count - 1) {  selectIndex = 0; } UIViewController * rootVC = [UIApplication sharedApplication].delegate.window.rootViewController; RHPhotoBrowserController * browser = [[RHPhotoBrowserController alloc] initWithType:type imageArr:imageArr selectIndex:selectIndex]; [rootVC presentViewController:browser animated:YES completion:nil];}@end

這樣使用的時候只需要使用該類就可以了。這里大家可以將單例去掉,將對象方法直接改為類方法即可。我是習慣了,所以這樣寫了。

再給大家看一下使用方法一步調用:

[[RHPhotoBrowser shared] browseImageWithType:RHPhotoSourceTypeFileName imageArr:@[@"c006", @"c007", @"c008", @"c009", @"c010"] selectIndex:2];

效果如下:

iOS開發教程,圖片瀏覽器,ios,自定義瀏覽器

最后,還是希望能夠幫助到有需要的朋友們,愿我們能夠一起學習進步,在開發的道路上越走越順利?。?!

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美一区二区白浆黑人| 欧美日韩一区二区免费在线观看| 亚洲国产古装精品网站| 色天天综合狠狠色| 91久久精品国产91久久| 亚洲精品久久久久国产| 欧美日韩在线免费观看| 欧美专区在线观看| 国产午夜精品免费一区二区三区| 久久久久久亚洲精品不卡| 97超级碰在线看视频免费在线看| 永久免费看mv网站入口亚洲| 91精品免费久久久久久久久| 久久久久成人网| 久久精品成人一区二区三区| 3344国产精品免费看| 国产亚洲欧美一区| 亚洲美女av电影| 91久久久久久| 一区二区欧美久久| 性欧美激情精品| 欧美成年人视频| 精品久久久国产| 午夜精品免费视频| 黑人精品xxx一区一二区| 久久影视三级福利片| 欧美精品做受xxx性少妇| 一区二区欧美激情| 秋霞av国产精品一区| 日韩av手机在线看| 亚洲国产精品高清久久久| 91精品国产91久久久久久不卡| 国产中文字幕亚洲| 欧美激情一区二区久久久| 2025国产精品视频| 久久成人精品电影| 欧美精品久久久久久久久久| 欧洲成人在线观看| 国产精品va在线| 在线观看亚洲区| 欧美高清视频免费观看| 亚洲视频在线视频| 亚洲欧洲在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 国产日韩精品视频| 国产在线精品一区免费香蕉| 国产精品免费久久久久影院| 欧美日韩黄色大片| 成人疯狂猛交xxx| xxxx欧美18另类的高清| 欧洲精品久久久| 久久精品国产亚洲| 久久综合伊人77777蜜臀| 国语自产精品视频在线看| 国产欧美婷婷中文| 久久午夜a级毛片| 久久久久五月天| 91av中文字幕| 亚洲国产成人久久综合一区| 日韩av高清不卡| 日韩在线视频线视频免费网站| 亚洲白虎美女被爆操| 欧美日韩国产限制| 精品亚洲一区二区三区在线观看| 一本一本久久a久久精品牛牛影视| 欧美日韩亚洲精品内裤| 色综合久综合久久综合久鬼88| 欧美精品videossex性护士| 亚洲欧美变态国产另类| 欧美另类69精品久久久久9999| 日本成熟性欧美| 亚洲va久久久噜噜噜| 欧美xxxx做受欧美| 国产91精品久久久| 91成人性视频| 日韩欧美精品网站| 亚洲国产天堂网精品网站| 久久99久久99精品中文字幕| 欧美激情视频在线免费观看 欧美视频免费一| 欧美一区亚洲一区| 久久五月天综合| 久久在线视频在线| 国产成人综合精品在线| 亚洲欧美综合图区| 91中文字幕在线观看| 在线成人一区二区| 国产97在线播放| 欧美性猛交xxxx富婆弯腰| 黄色91在线观看| 日韩电影中文字幕一区| 欧美猛男性生活免费| 亚洲激情在线观看| 国产精品69精品一区二区三区| 日韩av免费在线观看| 国产美女精品免费电影| 欧美日本精品在线| 欧美激情极品视频| 国产69精品久久久久9999| 91国产中文字幕| 操人视频在线观看欧美| 久久久久久久一| 亚洲片国产一区一级在线观看| 色悠悠久久88| 最新日韩中文字幕| 日韩www在线| 宅男66日本亚洲欧美视频| 美日韩精品免费观看视频| 久久全球大尺度高清视频| 亚洲第一区第二区| 国产精品女人网站| 555www成人网| 另类天堂视频在线观看| 欧美国产日产韩国视频| 丰满岳妇乱一区二区三区| 日韩在线观看成人| 91视频8mav| 人体精品一二三区| 精品一区二区三区三区| 成人情趣片在线观看免费| 国产精品99久久久久久人| 亚洲天堂一区二区三区| 亚洲第一精品电影| 97久久久免费福利网址| 97成人超碰免| 国产精品吹潮在线观看| 日韩免费在线播放| 欧美激情综合色综合啪啪五月| 国产精品爱久久久久久久| 91视频8mav| 成人两性免费视频| 性色av一区二区三区| 欧美综合第一页| 欧美有码在线视频| 午夜免费在线观看精品视频| 亚洲国产精品久久久久秋霞不卡| 日韩第一页在线| 久久99热这里只有精品国产| 亚洲a级在线观看| 国模视频一区二区三区| 国产成人黄色av| 97久久精品人搡人人玩| 亚洲最大av在线| 国产成人亚洲精品| 日韩中文字幕视频在线| 国产精品爽黄69天堂a| 欧美在线一级va免费观看| 欧美午夜片在线免费观看| 中文字幕日本精品| 日韩电影免费观看在线观看| 久久综合久久美利坚合众国| 欧美激情欧美激情在线五月| 国产精品igao视频| 成人精品在线观看| 日韩免费观看av| 欧美国产日韩视频| 97视频在线观看亚洲| 日韩在线观看你懂的| 国产精品1区2区在线观看| 羞羞色国产精品| 这里只有精品在线观看| 国产精品美女久久久久av超清| 国产精品久久久久99| 中文字幕综合在线| 中文字幕精品一区二区精品|