MTTransitions
将GL-Transitions的过渡端口移植到Metal。
特点
- 多达76种过渡效果
- 图像过渡效果
- UIView过渡效果
- UIViewController Push过渡效果
- UIViewController Present过渡效果
- 视频合成过渡效果
- 从图像使用过渡效果创建视频
- 从图像使用过渡效果和背景音乐创建视频
要求
- iOS 10.0+
- Xcode 11.0+
- Swift 5.0+
过渡
支持以下过渡
- MTAngularTransition
- MTBounceTransition
- MTBowTieHorizontalTransition
- MTBowTieVerticalTransition
- MTBurnTransition
- MTButterflyWaveScrawlerTransition
- MTCannabisleafTransition
- MTCircleCropTransition
- MTCircleTransition
- MTCircleOpenTransition
- MTColorPhaseTransition
- MTColourDistanceTransition
- MTCrazyParametricFunTransition
- MTCrossZoomTransition
- MTCrossHatchTransition
- MTCrossWarpTransition
- MTCubeTransition
- MTDirectionalTransition
- MTDirectionalWarpTransition
- MTDirectionalWipeTransition
- MTDisplacementTransition
- MTDoomScreenTransition
- MTDoorwayTransition
- MTDreamyTransition
- MTDreamyZoomTransition
- MTFadeTransition
- MTFadeColorTransition
- MTFadegrayscaleTransition
- MTFlyeyeTransition
- MTGlitchDisplaceTransition
- MTGlitchMemoriesTransition
- MTGridFlipTransition
- MTHeartTransition
- MTHexagonalizeTransition
- MTInvertedPageCurlTransition
- MTKaleidoScopeTransition
- MTLinearBlurTransition
- MTLumaTransition
- MTLuminanceMeltTransition
- MTMorphTransition
- MTMosaicTransition
- MTMultiplyBlendTransition
- MTPerlinTransition
- MTPinwheelTransition
- MTPixelizeTransition
- MTPolarFunctionTransition
- MTPolkaDotsCurtainTransition
- MTRadialTransition
- MTRandomSquaresTransition
- MTRippleTransition
- MTRotateScaleFadeTransition
- MTSimpleZoomTransition
- MTSquaresWireTransition
- MTSqueezeTransition
- MTStereoViewerTransition
- MTSwapTransition
- MTSwirlTransition
- MTTangentMotionBlurTransition
- MTTVStaticTransition
- MTUndulatingBurnOutTransition
- MTWaterDropTransition
- MTWindTransition
- MTWindowBlindsTransition
- MTWindowSliceTransition
- MTWipeDownTransition
- MTWipeLeftTransition
- MTWipeRightTransition
- MTWipeUpTransition
- MTZoomInCirclesTransition
安装
MTTransitions 可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中。
pod MTTransitions
入门
每个转换都要求两个输入 MTIImage
。图像应该是 .oriented(.downMirrored)
的。
import MTTransitions
let transition = MTBounceTransition()
transition.inputImage = <from Image>
transition.destImage = <to Image>
// animate progress from 0.0 to 1.0
imageView.image = transition.outputImage
UIView 转换
let effect = MTPerlinTransition()
MTTransition.transition(with: view, effect: effect, animations: {
// Do your animation to your view
}) { (_) in
// Transition completed
}
UIViewController 推送转换
class PushAViewController: UIViewController {
private let transition = MTViewControllerTransition(transition: MTBurnTransition())
// ...
}
extension PushAViewController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
if operation == .push {
return transition
}
return nil
}
}
UIViewController 切换效果
class PresentAViewController: UIViewController {
// ...
let vc = PresentBViewController()
vc.modalPresentationStyle = .fullScreen
vc.transitioningDelegate = self
present(vc, animated: true, completion: nil)
}
extension PresentAViewController: UIViewControllerTransitioningDelegate {
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return transtion
}
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return transtion
}
}
视频切换效果
MTTransitions
也支持添加切换效果的视频合并。
- 支持合并多个视频文件
- 支持多种切换效果
- 支持不同的多种渲染尺寸
- 支持透传切换
// pick one transtion effect
let effect = MTTransition.Effect.wipeLeft
let duration = CMTimeMakeWithSeconds(2.0, preferredTimescale: 1000)
try? videoTransition.merge(clips,
effect: effect,
transitionDuration: duration) { [weak self] result in
guard let self = self else { return }
let playerItem = AVPlayerItem(asset: result.composition)
playerItem.videoComposition = result.videoComposition
self.player.seek(to: .zero)
self.player.replaceCurrentItem(with: playerItem)
self.player.play()
}
请参阅 VideoTransitionSampleViewController
和 MultipleVideoTransitionsViewController
获取更多详细信息。
从图像创建视频
MTMovieMaker
支持 通过切换效果从一系列图像中创建视频。您也可以向 MTMovieMaker
传递本地音频文件的 URL 以创建背景音乐。
let fileURL = URL(fileURLWithPath: path)
movieMaker = MTMovieMaker(outputURL: fileURL)
do {
try MTMovieMaker?.createVideo(with: images, effects: effects) { result in
switch result {
case .success(let url):
print(url)
case .failure(let error):
print(error)
}
}
} catch {
print(error)
}