先打一个tag,完成调节瞳距、缩放的视图ui

This commit is contained in:
bluesea 2024-04-23 17:44:53 +08:00
parent 1623bfdfd0
commit dc596aeca2
14 changed files with 546 additions and 14 deletions

View File

@ -403,9 +403,9 @@
filePath = "SwiftProject/Project/Util/ZZHImageExtension.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "72"
endingLineNumber = "72"
landmarkName = "getRotateFrom()"
startingLineNumber = "79"
endingLineNumber = "79"
landmarkName = "getRotateFrom(_:)"
landmarkType = "7">
<Locations>
<Location
@ -438,6 +438,21 @@
endingLineNumber = "72"
offsetFromSymbolStart = "616">
</Location>
<Location
uuid = "742F2A13-D3B1-41EF-8BDA-BE012155DB3C - bb01223bea0e04d"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "__C.UIImage.getRotateFrom(__C.UIImageOrientation) -&gt; CoreGraphics.CGFloat"
moduleName = "SwiftProject"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/aaa/Documents/IOS%20Dev/VR/SwiftProject/SwiftProject/Project/Util/ZZHImageExtension.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "79"
endingLineNumber = "79"
offsetFromSymbolStart = "616">
</Location>
</Locations>
</BreakpointContent>
</BreakpointProxy>
@ -601,5 +616,37 @@
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "91D72EA1-7A61-4702-B30F-5B860A817DC7"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomSlider.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "265"
endingLineNumber = "265"
landmarkName = "touchesCancelled(_:with:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "2EE723C5-DE77-4E27-9444-4ED6E6C107FA"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "188"
endingLineNumber = "188"
landmarkName = "showEDView(sender:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints>
</Bucket>

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Tuning@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Tuning@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 976 B

View File

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "refresh (1).png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -42,11 +42,16 @@ class ZZHCustomPlayer: UIView {
var temScale:CGFloat = 1.0
var currentScale:CGFloat = 1.0//
var currentED:Int = 5//
let userdefaultValueKey_scale = "userdefaultValueKey_scale"
let userdefaultValueKey_ed = "userdefaultValueKey_ed"
//ui
var playerLayerBgView:UIView?
var avPlayer:AVPlayer?
var avPlayerLayer:AVPlayerLayer?
var timeSlider:ZZHCustomSlider?
var edBtn:UIButton? //
var prePlayingState:Bool = true {// ,player,便
didSet {
if(prePlayingState){
@ -82,6 +87,10 @@ class ZZHCustomPlayer: UIView {
deinit {
print("zzhcustomplayer deinit......")
UserDefaults.standard.setValue(currentScale, forKey: self.userdefaultValueKey_scale )
UserDefaults.standard.setValue(currentED, forKey: self.userdefaultValueKey_ed)
UserDefaults.standard.synchronize()
releaseVideoComposition()
assetReader?.cancelReading()
NotificationCenter.default.removeObserver(self)
@ -94,6 +103,23 @@ class ZZHCustomPlayer: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
//
if let defaultScale = UserDefaults.standard.value(forKey: userdefaultValueKey_scale) as? CGFloat {
currentScale = defaultScale
}
else {
UserDefaults.standard.setValue(currentScale, forKey: userdefaultValueKey_scale)
UserDefaults.standard.synchronize()
}
if let defaultED = UserDefaults.standard.value(forKey: userdefaultValueKey_ed) as? Int {
currentED = defaultED
}
else{
UserDefaults.standard.setValue(currentED, forKey: userdefaultValueKey_ed)
UserDefaults.standard.synchronize()
}
NotificationCenter.default.addObserver(self, selector: #selector(notification_PlayerEndTime(notification:)), name: AVPlayerItem.didPlayToEndTimeNotification, object: nil)
let playerWidth = KScreenWidth
@ -137,10 +163,30 @@ class ZZHCustomPlayer: UIView {
self.addSubview(timeSlider!)
timeSlider!.snp.makeConstraints { make in
make.left.equalToSuperview().offset(24)
make.right.equalToSuperview().offset(-24)
// make.right.equalToSuperview().offset(-24)
make.bottom.equalToSuperview().offset(0)
make.height.equalTo(120)
}
edBtn = UIButton()
edBtn?.setImage(UIImage(named: "custom_TuningBtn"), for: .normal)
edBtn?.addTarget(self, action: #selector(showEDView(sender:)), for: .touchUpInside)
self.addSubview(edBtn!)
edBtn!.snp.makeConstraints { make in
make.centerY.equalTo(timeSlider!.snp.centerY)
make.width.height.equalTo(40)
make.right.equalToSuperview().offset(-24)
make.left.equalTo(timeSlider!.snp.right).offset(24)
}
}
//
@objc func showEDView(sender:UIButton){
CustomParamBoardView.showBoard(scaleCallback: {[weak self] scale in
self?.currentScale = scale
}, edCallback: {[weak self] ed in
self?.currentED = ed
}, scale: currentScale, ed: currentED)
}
//sliderseek

View File

@ -56,7 +56,7 @@ extension ZZHCustomPlayer {
func convertFrame(request:AVAsynchronousCIImageFilteringRequest){
let compositionTime = request.compositionTime
let end:CMTime = CMTimeMake(value: Int64(compositionTime.value+1), timescale: compositionTime.timescale)
// let end:CMTime = CMTimeMake(value: Int64(compositionTime.value+1), timescale: compositionTime.timescale)
// let tr = CMTimeRange(start: compositionTime, end: end)
var ciImg:CIImage? = nil
@ -72,7 +72,8 @@ extension ZZHCustomPlayer {
}
else {
ciImg = self.otherModeImgWithMode(mode: self.selectedIndex,compositionTime: compositionTime)
guard let ciImg else {print("未合成成功.....,此处将进行重新构建assetoutput,然后再次重拾")
guard let ciImg else {
print("未合成成功.....,此处将进行重新构建assetoutput,然后再次重拾")
quickLoadAReaderWhenSeek(startCT: compositionTime)
ciImg = self.otherModeImgWithMode(mode: self.selectedIndex,compositionTime: compositionTime)
break
@ -97,7 +98,7 @@ extension ZZHCustomPlayer {
}
var ciImg:CIImage? = nil
var presentTime:CMTime? = nil
// var presentTime:CMTime? = nil
switch mode {
case .crossedEyes://
ciImg = self.videoTranserConvertor.convertVideo(asset: self.videoOriginalAsset, assetOutput: ao, type: self.selectedIndex, time: compositionTime,scale: currentScale,ed:currentED)

View File

@ -13,6 +13,7 @@ class ZZHCustomSlider: UIView {
var sLabel:UILabel?
var eLabel:UILabel?
var timeSlider:CustomSlider?
var processChangeValueCallback:CustomSliderProcessChangeValueCallback?
var preValue:Float = 0.0 //value
var totalSec:Int = -1//
@ -29,7 +30,7 @@ class ZZHCustomSlider: UIView {
bgView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.centerY.equalToSuperview()
make.height.equalTo(28)
make.height.equalTo(38)
}
timeSlider = CustomSlider()
@ -47,7 +48,7 @@ class ZZHCustomSlider: UIView {
bgView.addSubview(eLabel!)
sLabel?.snp.makeConstraints({ make in
make.left.equalTo(timeSlider!.snp.left)
make.top.equalTo(timeSlider!.snp.bottom).offset(10)
make.top.equalTo(timeSlider!.snp.bottom).offset(20)
make.bottom.equalToSuperview()
})
@ -192,3 +193,380 @@ class CustomSlider: UISlider {
}
//
typealias CCSliderCallback = (_ value:Float,_ isMoving:Bool)->Void
class CCSlider: UIView{
var preValue:Float = 0.0 //value
var callback:CCSliderCallback?
var slider:CustomSlider?
var sHeight:CGFloat = 0.0
override init(frame: CGRect) {
super.init(frame: frame)
slider = CustomSlider()
slider?.isUserInteractionEnabled = false
self.addSubview(slider!)
slider!.snp.makeConstraints { make in
make.left.top.right.bottom.equalToSuperview()
}
slider?.setThumbImage(UIImage(named: "slider_thumb"), for: .normal)
slider?.minimumTrackTintColor = .white
slider?.maximumTrackTintColor = UIColor(r: 20, g: 20, b: 20, a: 0.8)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
if slider!.isNormal == true {
slider!.isNormal = false
sHeight = self.height
self.updateSliderHeight(height: self.sHeight + 5)
}
let touch = touches.first
if let th = touch {
let touchPoint = th.location(in: self.slider!)
updateProcessValue(value: Float(touchPoint.x / self.slider!.frame.size.width),isMoving: true)
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
if slider!.isNormal == false {
slider!.isNormal = true
self.updateSliderHeight(height: self.sHeight)
}
updateProcessValue(value: preValue,isMoving: false)
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
if slider!.isNormal == false {
slider!.isNormal = true
self.updateSliderHeight(height: self.sHeight)
}
updateProcessValue(value: preValue,isMoving: false)
}
func updateSliderHeight(height:CGFloat) {
UIView.animate(withDuration: 0.25) {[weak self] in
self?.snp.updateConstraints {make in
make.height.equalTo(height)
}
self?.superview?.layoutIfNeeded()
} completion: { finish in
}
}
func updateProcessValue(value:Float,isMoving:Bool) {
self.slider!.value = value
guard let callback else {
return
}
var currentValue = max(0, min(value, 1))
preValue = currentValue
callback(preValue,isMoving)
}
}
typealias CustomParamBoardViewScaleCallback = (_ scale:CGFloat)->Void
typealias CustomParamBoardViewEDCallback = (_ ed:Int)->Void
typealias CustomParamBoardViewResetCallback = ()->Void
class CustomParamBoardView: UIView {
var scaleCallback:CustomParamBoardViewScaleCallback?
var edCallback:CustomParamBoardViewEDCallback?
var resetCallback:CustomParamBoardViewResetCallback?
var scaleSlider:CCSlider?
var scaleTitleLabel:UILabel?
var edSlider:CCSlider?
var edTitleLabel:UILabel?
let bgViewHeight = 400
lazy var bgView:UIView = {
let bg = UIView()
bg.backgroundColor = UIColor(r: 28, g: 28, b: 28, a: 1)
bg.layer.cornerRadius = 12
bg.layer.masksToBounds = true
let titleLabel = UILabel()
titleLabel.text = NSLocalizedString("v1.6_参数设置", comment: "")
titleLabel.textColor = .white
titleLabel.font = UIFont.boldSystemFont(ofSize: 16)
bg.addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
make.left.equalTo(20)
make.top.equalTo(12)
}
let resetBtn = UIButton()
bg.addSubview(resetBtn)
resetBtn.addTarget(self, action: #selector(resetParams(sender: )), for: .touchUpInside)
resetBtn.snp.makeConstraints { make in
make.width.height.equalTo(26)
make.centerY.equalTo(titleLabel.snp.centerY)
make.right.equalToSuperview().offset(-20)
}
resetBtn.setImage(UIImage(named: "custom_refresh"), for: .normal)
return bg
}()
let superBgView = UIView()
override init(frame: CGRect) {
super.init(frame: frame)
let tgrBgView = UIView()
self.addSubview(tgrBgView)
tgrBgView.snp.makeConstraints { make in
make.left.top.right.bottom.equalToSuperview()
}
self.addSubview(superBgView)
self.superBgView.snp.makeConstraints { make in
make.height.equalTo(170)
make.width.equalTo(330)
make.bottom.equalToSuperview().offset(bgViewHeight)
make.centerX.equalToSuperview()
}
self.superBgView.backgroundColor = .black
// let blackBgView = UIView()
// self.addSubview(blackBgView)
self.superBgView.addSubview(bgView)
bgView.snp.makeConstraints { make in
make.left.top.right.bottom.equalToSuperview()
}
scaleTitleLabel = UILabel()
superBgView.addSubview(scaleTitleLabel!)
scaleTitleLabel?.snp.makeConstraints { make in
make.left.equalToSuperview().offset(20)
make.top.equalToSuperview().offset(50)
}
scaleTitleLabel?.textColor = .white
scaleTitleLabel?.font = UIFont.systemFont(ofSize: 14)
scaleTitleLabel?.text = "缩放:100%"
scaleSlider = CCSlider(frame: .zero)
scaleSlider?.callback = {[weak self] (value,isMoving) in //scale0.5
if isMoving {
if(self?.scaleSlider?.tag == 0) {
self?.scaleSlider?.tag = 1
self?.hiddenOther(slider: self?.edSlider, titleLabel: self?.edTitleLabel)
}
}
else {
self?.scaleSlider?.tag = 0
self?.showAll()
}
self?.updateScaleTitleWithValue(value:value)
}
superBgView.addSubview(scaleSlider!)
scaleSlider!.snp.makeConstraints { make in
make.left.equalTo(scaleTitleLabel!.snp.left)
make.top.equalTo(scaleTitleLabel!.snp.bottom).offset(-1)
make.right.equalToSuperview().offset(-20)
make.height.equalTo(30)
}
edTitleLabel = UILabel()
superBgView.addSubview(edTitleLabel!)
edTitleLabel?.snp.makeConstraints { make in
make.left.equalTo(scaleTitleLabel!.snp.left)
make.top.equalTo(scaleSlider!.snp.bottom).offset(10)
}
edTitleLabel?.textColor = .white
edTitleLabel?.font = UIFont.systemFont(ofSize: 14)
edTitleLabel?.text = "瞳距:10mm"
edSlider = CCSlider(frame: .zero)
edSlider?.callback = {[weak self] (value,isMoving) in
if isMoving {
if(self?.edSlider?.tag == 0) {
self?.edSlider?.tag = 1
self?.hiddenOther(slider: self?.scaleSlider, titleLabel: self?.scaleTitleLabel)
}
}
else {
self?.edSlider?.tag = 0
self?.showAll()
}
self?.updateEDTitleLabelWith(value:value)
}
superBgView.addSubview(edSlider!)
edSlider!.snp.makeConstraints { make in
make.left.equalTo(edTitleLabel!.snp.left)
make.top.equalTo(edTitleLabel!.snp.bottom).offset(-1)
make.right.equalToSuperview().offset(-20)
make.height.equalTo(30)
}
let tgr = UITapGestureRecognizer(target: self, action: #selector(hidenView(sender: )))
tgrBgView.addGestureRecognizer(tgr)
}
//
func updateScaleTitleWithValue(value:Float) {
let minValue = 0.6
let maxValue = 1.5
let resultValue = minValue + (maxValue - minValue) * Double(value)
let formattedValue = String(format: "\(NSLocalizedString("v1.6_缩放", comment: ""))%.f%%", (resultValue - 0.5) * 200)
self.scaleTitleLabel?.text = formattedValue
if let scaleCallback = self.scaleCallback {
scaleCallback(CGFloat(resultValue))
}
}
//
func exUpdateScaleTitleWithValue(resultValue:CGFloat) {
let formattedValue = String(format: "\(NSLocalizedString("v1.6_缩放", comment: ""))%.f%%", (resultValue - 0.5) * 200)
self.scaleTitleLabel?.text = formattedValue
let minValue = 0.6
let maxValue = 1.5
// let resultValue = minValue + (maxValue - minValue) * Double(value)
let v = (resultValue - minValue) / (maxValue - minValue)
self.scaleSlider?.slider?.value = Float(v)
}
//
func updateEDTitleLabelWith(value:Float) {
let currED = Int(60 * (value - 0.5))
if let edCallback = self.edCallback {
edCallback(Int(currED))
}
let formattedValue = String(format: "\(NSLocalizedString("v1.6_瞳距", comment: ""))%dmm", currED)
self.edTitleLabel?.text = formattedValue
}
func exUpdateEDTitleLabelWith(currED:Int) {
let formattedValue = String(format: "\(NSLocalizedString("v1.6_瞳距", comment: ""))%dmm", currED)
self.edTitleLabel?.text = formattedValue
let v = Float(currED) * 1.0 / 30.0 + 0.5
self.edSlider?.slider?.value = v
}
func hiddenOther(slider:CCSlider?,titleLabel:UILabel?) {
UIView.animate(withDuration: 0.25) {[weak self] in
slider?.alpha = 0
titleLabel?.alpha = 0
self?.bgView.alpha = 0
} completion: { finish in
}
}
func showAll() {
UIView.animate(withDuration: 0.25) {[weak self] in
self?.scaleSlider?.alpha = 1
self?.scaleTitleLabel?.alpha = 1
self?.edSlider?.alpha = 1
self?.edTitleLabel?.alpha = 1
self?.bgView.alpha = 1
} completion: { finish in
}
}
//dismiss
@objc func hidenView(sender:UITapGestureRecognizer) {
UIView.animate(withDuration: 0.25) {[weak self] in
self?.superBgView.snp.updateConstraints({ make in
make.bottom.equalToSuperview().offset(self?.bgViewHeight ?? 400)
})
self?.layoutIfNeeded()
} completion: { finish in
self.removeFromSuperview()
}
}
class func showBoard(scaleCallback:@escaping CustomParamBoardViewScaleCallback,edCallback:@escaping CustomParamBoardViewEDCallback,scale:CGFloat,ed:Int) {
let view = CustomParamBoardView(frame: .zero)
view.scaleCallback = scaleCallback
view.edCallback = edCallback
view.exUpdateEDTitleLabelWith(currED: ed)
view.exUpdateScaleTitleWithValue(resultValue: scale)
KWindow?.addSubview(view)
view.snp.makeConstraints { make in
make.left.top.right.bottom.equalToSuperview()
}
KWindow?.layoutIfNeeded()
UIView.animate(withDuration: 0.25) {
view.superBgView.snp.updateConstraints { make in
make.bottom.equalToSuperview().offset(-30)
}
view.layoutIfNeeded()
} completion: { finish in
}
}
//
@objc func resetParams(sender:UIButton) {
if let rc = self.resetCallback {
rc()
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

View File

@ -176,8 +176,8 @@ class PlayByTransferConvertor {
//
func joinImages( leftImage:CIImage, rightImage:CIImage,scale:CGFloat,ed:Int) -> CIImage {
// let scale = 1.0 //,0.5
// let ed = 5 //, 1:2, -30 ~ +30
//,0.5
//, 1:2, -30 ~ +30
let edS = 30 //
let left = UIImage(ciImage: leftImage )
@ -191,7 +191,7 @@ class PlayByTransferConvertor {
//
let x_offset = CGFloat(abs(ed) * edS) //x
let imageWidth = left.size.width/2 - x_offset
let imageWidth = left.size.width*0.5 - x_offset
let imageHeight = left.size.height
let ed_left = getImgWithED(image: n_left, imgWidth: imageWidth)
let ed_right = getImgWithED(image: n_right, imgWidth: imageWidth)
@ -205,7 +205,7 @@ class PlayByTransferConvertor {
}
else if (ed < 0) {
ed_left.draw(in: CGRect(x:x_offset, y:0, width:imageWidth, height:imageHeight))
ed_right.draw(in: CGRect(x:imageWidth, y:0, width:imageWidth, height:imageHeight))
ed_right.draw(in: CGRect(x:left.size.width*0.5, y:0, width:imageWidth, height:imageHeight))
}
else {//
ed_left.draw(in: CGRect(x:0, y:0, width:imageWidth, height:imageHeight))

View File

@ -7,9 +7,16 @@
import Foundation
import UIKit
import CoreImage
extension UIImage {
func imageAtRect(rect: CGRect) -> UIImage? {
// CGRect
guard let cgImage = self.cgImage else { return nil }
let imageRef = cgImage.cropping(to: rect)
return imageRef == nil ? nil : UIImage(cgImage: imageRef!)
}
// func rotate( radians: CGFloat) -> UIImage? {
// //
// let radians = radians * CGFloat.pi / 180

View File

@ -134,3 +134,8 @@
"v1.5_submit" = "Submit";
"v1.5_menu_lang" = "en";
"v1.5_提交中..." = "submiting...";
//V1.6版本
"v1.6_参数设置" = "参数设置";
"v1.6_缩放" = "缩放:";
"v1.6_瞳距" = "瞳距:";

View File

@ -134,3 +134,8 @@
"v1.5_submit" = "提交";
"v1.5_menu_lang" = "zh";
"v1.5_提交中..." = "提交中...";
//V1.6版本
"v1.6_参数设置" = "参数设置";
"v1.6_缩放" = "缩放:";
"v1.6_瞳距" = "瞳距:";