Need help with KNPhotoBrowser?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

263 Stars 53 Forks MIT License 456 Commits 0 Opened issues


📷 图片 || 视频 浏览器(本地和网络) , UIViewController + CollectionView , 完美适配 iPhone 以及 iPad ,屏幕旋转功能 , 适配SDWebImage 5.0

Services available


Need anything else?

Contributors list



中文 | English

most like photo or video browser of
in China
if you get any function to add, just contact me by E-mail. Welcome to Star

image image image image image

Update content

  • [x] photoBrowser has been coded by
  • [x] ready for
  • [x] perfect adapt for rotate of the Screen , try it on the real device
  • [x] panGesture to dismiss or cancel
  • [x] prefetch image with API
  • [x] locate and net GIF is ready use
  • [x] video player is ready to use( locate and net video)
  • [x] video swipe function is ready to use
  • [x] video player contain autoplay API
  • [x] video player add quick play API
  • [x] custom control on the photoBrowser
  • [x] custom is followed with photoBrowser to dismiss or show
  • [x] all alert or toast will be down by delegate function

1.Function describe and Point

  • 1.depend
    , if need locate gif, depend
  • 2.most like photoBrowser of Wechat and Weibo in China
  • 3.provide function which can delete and download image or video
  • 4.custom control as you wish

2.How to use

1.init KNPhotoBrowser, set params

// 1.make every control as an object, put it into an array
KNPhotoItems *items = [[KNPhotoItems alloc] init];
items.url = [urlArr[i] stringByReplacingOccurrencesOfString:@"thumbnail" withString:@"bmiddle"];
items.sourceView = imageView;
// if current url is video type
// items.isVideo = true;
// if current image is locate gif
// itemM.isLocateGif = true;
[self.itemsArr addObject:items];

2.present , custom control as you wish

KNPhotoBrowser *photoBrowser = [[KNPhotoBrowser alloc] init];
photoBrowser.itemsArr = [self.itemsArr copy];
photoBrowser.isNeedPageNumView = true;
photoBrowser.isNeedRightTopBtn = true;
photoBrowser.isNeedPictureLongPress = true;
photoBrowser.isNeedPanGesture = true;
photoBrowser.isNeedPrefetch = true;
photoBrowser.isNeedAutoPlay = true;
photoBrowser.currentIndex = tap.view.tag;
photoBrowser.delegate = self;
[photoBrowser present];

3.provide Delegate --> KNPhotoBrowserDelegate

 photoBrowser will dismiss
- (void)photoBrowserWillDismiss;

@optional /** photoBrowser right top button did click */

  • (void)photoBrowserRightOperationAction;

@optional /** photoBrowser Delete image success with relative index

@param index relative index */

  • (void)photoBrowserRightOperationDeleteImageSuccessWithRelativeIndex:(NSInteger)index;

@optional /** photoBrowser Delete image success with absolute index

@param index absolute index */

  • (void)photoBrowserRightOperationDeleteImageSuccessWithAbsoluteIndex:(NSInteger)index;

@optional /** is success or not of save picture

@param success is success */

  • (void)photoBrowserWriteToSavedPhotosAlbumStatus:(BOOL)success DEPRECATED_MSG_ATTRIBUTE("use delegate function photoBrowserToast:photoBrower:photoItemRelative:photoItemAbsolute: instead");

@optional /** download video with progress @param progress current progress */

  • (void)photoBrowserDownloadVideoWithProgress:(CGFloat)progress;

@optional /** photoBrowser scroll to current index @param index current index */

  • (void)photoBrowserScrollToLocateWithIndex:(NSInteger)index;

@optional /// photoBrowser did long press /// @param photoBrowser photobrowser /// @param longPress long press gestureRecognizer

  • (void)photoBrowser:(KNPhotoBrowser *)photoBrowser longPress:(UILongPressGestureRecognizer *)longPress;

@optional /// download image or video success | failure | failure reason call back /// @param photoBrowser toast on photoBrower.view /// @param state state /// @param photoItemRe relative photoItem /// @param photoItemAb absolute photoItem

  • (void)photoBrowser:(KNPhotoBrowser *)photoBrowser
    photoItemRelative:(KNPhotoItems *)photoItemRe photoItemAbsolute:(KNPhotoItems *)photoItemAb;

@optional /** photoBrowser will layout subviews */

  • (void)photoBrowserWillLayoutSubviews;

4.provide function of dismiss

// maybe you never use it
[_photoBrowser dismiss];


 current select index
@property (nonatomic,assign) NSInteger  currentIndex;

/** contain KNPhotoItems : url && UIView */ @property (nonatomic,strong) NSArray *itemsArr;

/** Delegate */ @property (nonatomic,weak ) id delegate;

/** is or not need pageNumView , default is false */ @property (nonatomic,assign) BOOL isNeedPageNumView;

/** is or not need pageControl , default is false (but if photobrowser contain video,then hidden) */ @property (nonatomic,assign) BOOL isNeedPageControl;

/** is or not need RightTopBtn , default is false */ @property (nonatomic,assign) BOOL isNeedRightTopBtn;

/** is or not need PictureLongPress , default is false */ @property (nonatomic,assign) BOOL isNeedPictureLongPress;

/** is or not need prefetch image, maxCount is 8 (KNPhotoBrowserPch.h) */ @property (nonatomic,assign) BOOL isNeedPrefetch;

/** is or not need pan Gesture, default is false */ @property (nonatomic,assign) BOOL isNeedPanGesture;

/** is or not need auto play video, default is false */ @property (nonatomic,assign) BOOL isNeedAutoPlay;

/** is or not need follow photoBrowser , default is false when touch photoBrowser, the customView will be hidden when you cancel, the customView will be showed when dismiss the photoBrowser immediately, the customView will be hidden immediately */ @property (nonatomic,assign) BOOL isNeedFollowAnimated;

/** delete current photo or video */

  • (void)deletePhotoAndVideo;

/** download photo or video to Album, but it must be authed at first */

  • (void)downloadPhotoAndVideo;

/** player's rate immediately to use */

  • (void)setImmediatelyPlayerRate:(CGFloat)rate;

/** create custom view on the topView(photoBrowser controller's view) for example: create a scrollView on the photoBrowser controller's view, when photoBrowser has scrolled , you can use delegate's function to do something you think delegate's function: 'photoBrowserScrollToLocateWithIndex:(NSInteger)index' 'CustomViewController' in Demo, you can see it how to use @param customViewArr customViewArr @param animated need animated or not, with photoBrowser present @param followAnimated need animated or not for follow photoBrowser */

  • (void)createCustomViewArrOnTopView:(NSArray *)customViewArr

/** photoBrowser show */

  • (void)present;

/** photoBrowser dismiss */

  • (void)dismiss;

How to install

pod 'KNPhotoBrowser'

// terminal : cd ~(current path) pod install or pod update

By the way

  • 1.Currently, It just be used in nine picure ,scrollView, tableView , chat session for IM
  • 2.if you find any bug, just contact me, it will be perfect by each other
  • 3.perfect adapt
  • 4.perfect adapt the
    rotate of the Screen
  • 5.if you get any idea, just contact me! Thanks

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.