- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试复制 Snapchat 相机的缩放功能,一旦您开始录制,您可以向上或向下拖动手指,它会相应地放大或缩小。我已经成功地缩放了捏,但一直坚持使用 PanGestureRecognizer
进行缩放。
这是我试过的代码,问题是我不知道如何替换用于捏合手势识别器缩放的 sender.scale
。我正在使用 AVFoundation。基本上,我问的是如何像在 TikTok 或 Snapchat 中一样正确地进行按住缩放(一根手指拖动)。
let minimumZoom: CGFloat = 1.0
let maximumZoom: CGFloat = 15.0
var lastZoomFactor: CGFloat = 1.0
var latestDirection: Int = 0
@objc func panGesture(_ sender: UIPanGestureRecognizer) {
let velocity = sender.velocity(in: doubleTapSwitchCamButton)
var currentDirection: Int = 0
if velocity.y > 0 || velocity.y < 0 {
let originalCapSession = captureSession
var devitce : AVCaptureDevice!
let videoDeviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera, .builtInDuoCamera], mediaType: AVMediaType.video, position: .unspecified)
let devices = videoDeviceDiscoverySession.devices
devitce = devices.first!
guard let device = devitce else { return }
// Return zoom value between the minimum and maximum zoom values
func minMaxZoom(_ factor: CGFloat) -> CGFloat {
return min(min(max(factor, minimumZoom), maximumZoom), device.activeFormat.videoMaxZoomFactor)
}
func update(scale factor: CGFloat) {
do {
try device.lockForConfiguration()
defer { device.unlockForConfiguration() }
device.videoZoomFactor = factor
} catch {
print("\(error.localizedDescription)")
}
}
//These 2 lines below are the problematic ones, pinch zoom uses this one below, and the newScaleFactor below that is a testing one that did not work.
let newScaleFactor = minMaxZoom(sender.scale * lastZoomFactor)
//let newScaleFactor = CGFloat(exactly: number + lastZoomFactor)
switch sender.state {
case .began: fallthrough
case .changed: update(scale: newScaleFactor!)
case .ended:
lastZoomFactor = minMaxZoom(newScaleFactor!)
update(scale: lastZoomFactor)
default: break
}
} else {
}
latestDirection = currentDirection
}
最佳答案
您可以使用手势识别器的平移属性,以点为单位计算位移,并将此位移归一化为缩放因子。
将此放入您的代码中,您可以尝试:
... somewhere in your view setup code, i.e. viewDidLoad....
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panGesture))
button.addGestureRecognizer(panGestureRecognizer)
private var initialZoom: CGFloat = 1.0
@objc func panGesture(_ sender: UIPanGestureRecognizer) {
// note that 'view' here is the overall video preview
let velocity = sender.velocity(in: view)
if velocity.y > 0 || velocity.y < 0 {
let originalCapSession = captureSession
var devitce : AVCaptureDevice!
let videoDeviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera, .builtInDuoCamera], mediaType: AVMediaType.video, position: .unspecified)
let devices = videoDeviceDiscoverySession.devices
devitce = devices.first!
guard let device = devitce else { return }
let minimumZoomFactor: CGFloat = 1.0
let maximumZoomFactor: CGFloat = min(device.activeFormat.videoMaxZoomFactor, 10.0) // artificially set a max useable zoom of 10x
// clamp a zoom factor between minimumZoom and maximumZoom
func clampZoomFactor(_ factor: CGFloat) -> CGFloat {
return min(max(factor, minimumZoomFactor), maximumZoomFactor)
}
func update(scale factor: CGFloat) {
do {
try device.lockForConfiguration()
defer { device.unlockForConfiguration() }
device.videoZoomFactor = factor
} catch {
print("\(error.localizedDescription)")
}
}
switch sender.state {
case .began:
initialZoom = device.videoZoomFactor
startRecording() /// call to start recording your video
case .changed:
// distance in points for the full zoom range (e.g. min to max), could be view.frame.height
let fullRangeDistancePoints: CGFloat = 300.0
// extract current distance travelled, from gesture start
let currentYTranslation: CGFloat = sender.translation(in: view).y
// calculate a normalized zoom factor between [-1,1], where up is positive (ie zooming in)
let normalizedZoomFactor = -1 * max(-1,min(1,currentYTranslation / fullRangeDistancePoints))
// calculate effective zoom scale to use
let newZoomFactor = clampZoomFactor(initialZoom + normalizedZoomFactor * (maximumZoomFactor - minimumZoomFactor))
// update device's zoom factor'
update(scale: newZoomFactor)
case .ended, .cancelled:
stopRecording() /// call to start recording your video
break
default:
break
}
}
}
关于ios - 平移手势(按住/拖动)像 Snapchat 一样在相机上缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54431439/
在创建 shapchat ( https://www.snapchat.com/ ) 用户名时,我一直无法找到允许的字符。这里有人可以分享他们关于这方面的知识吗? 上下文:我正在创建一个用户名验证
按照 snapkit 登录文档 (WEB),我实现了服务器端代码并能够为用户获取访问 token (第 2.5 节 https://docs.snapchat.com/docs/tutorials
我正在开发一个网站。我在基于 php、html 的网站上添加了许多社交登录或共享按钮、链接,例如 facebook、tweeter、gplus、pintrest。现在我必须为 snapchat 添加社
我想知道是否有一种方法可以编写允许 PBJVision 在用户在后台播放自己的音乐时录制视频的功能。 最佳答案 AVAudioSession.sharedInstance().setCategory(
我正在开发一个 iOS 应用程序,用户可以发布该应用程序然后接收他们的快照。我已经看到用 "SnapHack" 完成了此操作但 SnapChat 本身并没有允许你做这些事情的 API。那么有人可以引导
SnapChat 如何将图像调整为如此小的文件大小,同时仍保持良好的质量?我的图像为后置摄像头节省了大约 90KB,为前置摄像头节省了 45KB。我在网上看到发送一个快照大约是 15kb。如何更好地优
我无法理解如何着手创建向下滑动手势来关闭覆盖层,该覆盖层是另一个具有自己的对象和图像的屏幕,然后能够滑动回到原始屏幕。 我目前有一个包含 3 个屏幕的 ScrollView 。一个 |乙 | C 和我
我正在开发一个 iOS 应用程序,用户可以在上传图像(如 Snapchat)时添加描述/文本。 他们是渲染图像并将文本添加到图像中,以便它成为图像本身的一部分,还是显示为图像上的 UILabel? 对
我很想知道 SnapChat 如何将数据发送到其他移动设备。例如,它是将数据发送到服务器然后将其存储以供下载,还是通过内置 ios 功能将数据直接发送到设备? 我对在设备之间发送数据的整个过程很感兴趣
我想在不同大小的视频上添加全屏叠加图像, 如果叠加层和视频具有相同的比例(相同的宽度和高度),我使用 ffmpeg 它可以正常工作。 如果视频高度和宽度尺寸小于叠加图像,则叠加图像被挤压,但我想像快照
我正在 android 和 ios 上构建一个应用程序,并且要求用户输入他们的 Snapchat 帐户。我不希望人们添加虚假的 Snapchat 帐户,所以我到处搜索但找不到方法。 我只找到了这个答案
我似乎无法理解一个好的设计,它允许用户创建一个对象,保存到数据库并跟踪该对象是否发布到服务器。 就像在 snapchat 中一样 - 离线时,您可以创建一个包含图片和接收者的快照对象,按发送,它会显示
因此,我们的想法是像 Snapchat 一样向用户提供某种通知(不必是标准的 Android 通知,可以是库或自定义通知)。也就是说,它出现在应用程序中,然后消失,不会出现在状态栏或通知抽屉中。有没有
我正在尝试在我的项目中实现 Snapchat 登录按钮。我已经下载了 SDK,创建了 Snapchat 开发者帐户,并在 info.plist 中编写了一些代码。 现在我可以登录 Snapchat 帐
我想像在 snapchat 中一样使用视频过滤器创建 android 应用程序。问题是我在 IOS 中找不到像 SCRecorder 这样的库,我已经在应用程序中添加了 FFmpeg 但即使使用 ff
我正在创建一个类似于 snapchat 的相机胶卷功能,其中相机位于底层,然后在点击一个按钮后相机胶卷出现。相机胶卷不会占据整个屏幕顶部的搜索栏仍然保留,并且在用向下滑动手势关闭时相机仍在运行。我不确
Snapchat 是如何把这个导航栏做成渐变背景和圆角的。谢谢! 我没有足够大的声誉来发布图片,但它是向人们展示你的 snapchat 的 View ,一直到左边。 func application(
在 snapchat 的登录页面上,按钮出现在键盘的顶部,我可以这样做,但由于 6plus 有不同尺寸的键盘,它把它的一部分切掉了。 我在垂直堆栈 View 中有两个文本字段和两个按钮,我希望垂直堆栈
我无法弄清楚如何将视频从 SnapChat 分享到我的应用程序,而 WhatsApp 可以毫无问题地做到这一点,所以这是可能的。 由于 SnapChat 与 contentprovider 一起使用,
在Shapchat的照片编辑器中,有一个带有引导线的剪刀工具提取对象(通过绘制要提取的对象的边缘)。 我想用 openCV 实现该工具,但我对 openCV 完全陌生。我搜索了openCV文档和教程,
我是一名优秀的程序员,十分优秀!