AKMediaViewer
一个美丽的 iOS 库,可以将您的图像和视频缩略图动画化至全屏。是用 Swift 编写的
AKMediaViewer 允许通过简单的触摸来关注任何缩略图图像或视频。缩略图图像会自动动画化至全屏图像视图或视频播放器。再次触摸“完成”按钮将图像缩小(或取消关注)回初始位置。
每个缩略图图像视图可能都有自己的转换,焦点和取消焦点动画确保它会回到初始状态。
视频
如果媒体是视频,则会显示视频播放器(支持的扩展名:".mp4" 和 ".mov")。视频播放器带有自己的控件:播放/暂停按钮、滑块和时间标签。由于 ASBPlayerScrubbing,因此提供了滚动功能。
方向
即使您的主视图控制器只有纵向模式,焦点视图也会自动适应屏幕方向。
图像内容模式
目前仅支持UIViewContentMode.ScaleAspectFit
和UIViewContentMode.ScaleAspectFill
,但这些模式是最常用的。
在UIViewContentMode.ScaleAspectFill
模式下,视图会扩展以显示全屏图像。
如果您想支持其他内容模式,请给我留言。您甚至可以尝试提交一个拉取请求,这将非常受欢迎!
图像大小
即使图像尺寸小于屏幕分辨率,当图像获取焦点时也会显示全屏图像。在这种情况下,没有可用的交互式缩放。
支持所有图像大小。
示例项目
查看包含的示例,以了解如何轻松地将AKMediaViewer
集成到您的项目中。
要构建示例,您首先需要从AKMediaViewerExample
目录运行pod install
。
安装
AKMediaViewer可通过CocoaPods获取。
要安装,请在Podfile中添加以下行
pod 'AKMediaViewer'
易于使用
- 创建一个
AKMediaViewerManager
- 实现其代理
AKMediaViewerDelegate
,代理主要返回媒体URL、媒体标题和父视图控制器。 - 通过调用
.installOnView(view: UIView)
来声明您想要关注的所有视图
实现
在你的视图控制器中,将以下代码添加到需要焦点功能的光图像视图。
override func viewDidLoad() {
super.viewDidLoad()
mediaViewerManager = AKMediaViewerManager.init()
mediaViewerManager!.delegate = self
// Tells which views need to be focusable. You can put your image views in an array and give it to the focus manager.
mediaViewerManager!.installOnViews(imageViewsArray)
}
以下是一个代理实现示例。请根据您的具体情况修改代码。
override func viewDidLoad() {
...
var mediaNames: [String] = ["1f.jpg", "2f.jpg", "3f.mp4", "4f.jpg"]
...
}
// MARK: - AKMediaViewerDelegate
// Returns the view controller in which the focus controller is going to be added.
// This can be any view controller, fullscreen or not.
func parentViewControllerForMediaViewerManager(manager: AKMediaViewerManager) -> UIViewController {
return self
}
// Returns the URL where the media (image or video) is stored. The URL may be local (file://) or distant (http://).
func mediaViewerManager(manager: AKMediaViewerManager, mediaURLForView view: UIView) -> NSURL {
let index: Int = view.tag - 1
let name: NSString = mediaNames[index]
let url: NSURL = NSBundle.mainBundle().URLForResource(name.stringByDeletingPathExtension, withExtension: name.pathExtension)!
return url
}
// Returns the title for this media view. Return nil if you don't want any title to appear.
func mediaViewerManager(manager: AKMediaViewerManager, titleForView view: UIView) -> String {
return "My title"
}
如果您需要程序化地聚焦或取消聚焦视图,可以调用startFocusingView
(假设视图是可聚焦的)或endFocusing
。
mediaViewerManager.startFocusingView(mediaView)
属性
public var animationDuration: TimeInterval
动画持续时间。默认为0.5。
public var backgroundColor: UIColor
背景颜色。默认为透明黑色。
public var defocusOnVerticalSwipe: Bool
启用垂直滑动时取消焦点。默认为True。
public var elasticAnimation: Bool
返回动画是否有弹性效果。默认为True。
public var zoomEnabled: Bool
返回在全屏图像上是否启用缩放。默认为True。
public var focusOnPinch: Bool
启用缩放手势的聚焦。默认为False。
public var gestureDisabledDuringZooming: Bool
返回在缩放期间是否禁用手势。默认为True。
public var isDefocusingWithTap: Bool
返回是否点击视图时启用取消聚焦。默认为False。
public var addPlayIconOnVideo: Bool
返回是否自动将播放图标添加到视频缩略图。默认为True。
public let playImage: UIImage?
用于在视频缩略图上显示播放图标的图像。默认为None(使用内部图像)。
public var topAccessoryController: UIViewController?
用于显示自定义附件的控制器。如果没有指定,将使用默认控制器,带有简单的关闭按钮。
隐藏状态栏
如果您想在视图聚焦或取消聚焦时隐藏或显示状态栏,可以使用可选的代理方法.mediaViewerManagerWillAppear:
和.mediaViewerManagerWillDisappear:
。
以下是如何隐藏和显示状态栏的示例。由于代理方法在动画块内调用,状态栏的隐藏或显示将以动画方式完成。
func mediaViewerManagerWillAppear(manager: AKMediaViewerManager) {
/*
* Call here setDefaultDoneButtonText, if you want to change the text and color of default "Done" button
* eg: mediaViewerManager!.setDefaultDoneButtonText("Panda", withColor: UIColor.purple)
*/
self.statusBarHidden = true
if (self.respondsToSelector(#selector(UIViewController.setNeedsStatusBarAppearanceUpdate))) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
func mediaViewerManagerWillDisappear(mediaViewerManager: AKMediaViewerManager) {
self.statusBarHidden = false
if (self.respondsToSelector(#selector(UIViewController.setNeedsStatusBarAppearanceUpdate))) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
override func prefersStatusBarHidden() -> Bool {
return self.statusBarHidden
}
// statusBarHidden is defined as a property.
var statusBarHidden: Bool = false
协作
我试图构建一种简单的方法来使用API,同时使其足够灵活以适应多种变体,但我相信有改进和添加更多功能的方法,所以请随时就想法、问题或拉取请求进行协作。
即将到来的改进
- 允许使用自定的视频控制视图
- 修正全屏缩放图片时方向变更导致的图片跳跃(仅在父ViewController支持UIInterfaceOrientationMask.Portrait | UIInterfaceOrientationMaskPortrait.UpsideDown时)
- 全屏中通过水平滑动浏览媒体
自动引用计数(ARC)
AKMediaViewer需要自动引用计数(ARC)。
许可证
AKMediaViewer使用MIT许可证。
感谢原始团队
Philippe Converset @autresphere