AKMediaViewer 1.0.9

AKMediaViewer 1.0.9

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最后发布Sep 2018
SPM支持 SPM

Diogo Autilio 维护。



AKMediaViewer

一个美丽的 iOS 库,可以将您的图像和视频缩略图动画化至全屏。是用 Swift 编写的

Build Status Cocoapods Pod License

AKMediaViewer 允许通过简单的触摸来关注任何缩略图图像或视频。缩略图图像会自动动画化至全屏图像视图或视频播放器。再次触摸“完成”按钮将图像缩小(或取消关注)回初始位置。

每个缩略图图像视图可能都有自己的转换,焦点和取消焦点动画确保它会回到初始状态。

视频

如果媒体是视频,则会显示视频播放器(支持的扩展名:".mp4" 和 ".mov")。视频播放器带有自己的控件:播放/暂停按钮、滑块和时间标签。由于 ASBPlayerScrubbing,因此提供了滚动功能。

方向

即使您的主视图控制器只有纵向模式,焦点视图也会自动适应屏幕方向。

图像内容模式

目前仅支持UIViewContentMode.ScaleAspectFitUIViewContentMode.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

https://github.com/autresphere/ASMediaFocusManager