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

首頁 > 系統 > iOS > 正文

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

2020-07-26 02:33:55
字體:
來源:轉載
供稿:網友

前言

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

實現原理

通過彈出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];

效果如下:


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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品激情自拍| 日韩视频永久免费观看| 日韩中文字幕网站| 91久久久久久久久久| 欧美在线一级视频| 欧美激情videos| 国产成人一区二区| 91成人性视频| 日韩久久精品成人| 海角国产乱辈乱精品视频| 亚洲欧美精品一区二区| 国产精品专区h在线观看| 久久国产色av| 国产精品亚发布| 在线精品视频视频中文字幕| 成人国产在线激情| 美女啪啪无遮挡免费久久网站| 两个人的视频www国产精品| 国产精品久久久久久久久久| 91精品国产成人www| 欧美性高跟鞋xxxxhd| 久久天天躁狠狠躁夜夜躁2014| 日韩日本欧美亚洲| 国产精品免费看久久久香蕉| 亲子乱一区二区三区电影| 国产精品久久电影观看| 亚洲综合在线播放| 国产在线久久久| 国模精品视频一区二区| 欧美乱大交xxxxx| 国产精品88a∨| 欧美日韩免费区域视频在线观看| 91久久精品视频| 欧美日韩亚洲一区二| 色yeye香蕉凹凸一区二区av| 国产中文字幕日韩| 91精品国产高清久久久久久91| 69国产精品成人在线播放| 欧美刺激性大交免费视频| 亚洲美女av在线播放| 色综合久久精品亚洲国产| 亚洲影院色无极综合| 91国内产香蕉| 欧美在线观看日本一区| 91国产精品电影| 成人福利视频在线观看| 国产z一区二区三区| 亚洲天堂精品在线| 亚洲精品乱码久久久久久金桔影视| 国产成人中文字幕| 亚洲国产日韩精品在线| 日韩电影免费观看在线观看| 欧美日韩视频在线| 亚洲淫片在线视频| 欧美精品一区二区三区国产精品| 91天堂在线观看| 亚洲高清色综合| 亚洲成人久久网| 欧美视频在线免费看| 精品成人69xx.xyz| 97碰在线观看| 色综合久久久888| 亚洲人成毛片在线播放| 日韩欧美国产激情| 66m—66摸成人免费视频| 久久频这里精品99香蕉| 91麻豆国产语对白在线观看| 亚洲精品自产拍| 亚洲第一网站男人都懂| 欧美天堂在线观看| 国产精品美女主播在线观看纯欲| 欧美成人第一页| 7777kkkk成人观看| 欧美一区二区大胆人体摄影专业网站| 91久久精品视频| 亚洲片国产一区一级在线观看| 中日韩午夜理伦电影免费| 欧美人在线视频| 中文字幕日韩免费视频| 欧美激情精品久久久久久变态| 精品成人在线视频| 91免费在线视频| 川上优av一区二区线观看| 91国在线精品国内播放| 欧美综合国产精品久久丁香| 国产免费一区二区三区在线能观看| 亚洲毛片在线看| 亚洲精品电影网| 欧美综合激情网| 日韩精品免费在线| 蜜臀久久99精品久久久无需会员| 日韩在线视频免费观看| 亚洲综合日韩中文字幕v在线| 欧美精品做受xxx性少妇| 欧美成人激情视频免费观看| 色综合伊人色综合网站| 国产精品高潮呻吟久久av无限| 91精品国产综合久久久久久久久| 久久久最新网址| 亚洲午夜久久久影院| 亚洲人成电影网站| yellow中文字幕久久| 精品免费在线视频| 亚洲欧美国产va在线影院| 亚洲 日韩 国产第一| 久久久久久久久久久免费精品| 国产精品免费久久久久影院| 国产91露脸中文字幕在线| 欧美猛交免费看| 欧美最顶级丰满的aⅴ艳星| 亚洲偷欧美偷国内偷| 欧美一区二区色| 国产精品直播网红| 日本成人黄色片| 国产成人综合亚洲| 亚洲一二在线观看| 91九色视频在线| www国产亚洲精品久久网站| 亚洲在线一区二区| 欧美黄色成人网| 久久伊人精品视频| 亚洲国产福利在线| 亚洲黄色av网站| 国产亚洲人成网站在线观看| 亚洲aⅴ日韩av电影在线观看| 性夜试看影院91社区| 国产精品白嫩初高中害羞小美女| 欧美野外猛男的大粗鳮| 久久av资源网站| 91精品美女在线| 伊人一区二区三区久久精品| 国产一区二区三区日韩欧美| 欧美激情欧美狂野欧美精品| 91精品久久久久久久| 91精品国产色综合久久不卡98口| 欧美成人中文字幕| 91欧美视频网站| 黑人狂躁日本妞一区二区三区| 亚洲最新在线视频| 久久香蕉频线观| 成人激情视频免费在线| 色噜噜狠狠狠综合曰曰曰88av| 中文字幕日韩在线观看| 亚洲色图35p| 欧美激情视频播放| 国产精品自拍偷拍| 日韩中文字幕在线观看| 韩国美女主播一区| 国产精品中文字幕久久久| 日韩高清电影免费观看完整版| 国语自产精品视频在线看抢先版图片| 成人性生交大片免费观看嘿嘿视频| 538国产精品视频一区二区| 最新国产成人av网站网址麻豆| 中文亚洲视频在线| 午夜精品久久久久久久久久久久| 亚洲人午夜精品| 8090理伦午夜在线电影| 在线不卡国产精品| 国产精品视频色| 裸体女人亚洲精品一区| 亚洲欧美色图片| xxxx欧美18另类的高清| 国产精品成人一区二区三区吃奶|