先打一个tag,完成调节瞳距、缩放的视图ui
This commit is contained in:
parent
1623bfdfd0
commit
dc596aeca2
Binary file not shown.
@ -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) -> 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>
|
||||
|
||||
22
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Contents.json
vendored
Normal file
22
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Contents.json
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
BIN
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Tuning@2x.png
vendored
Normal file
BIN
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Tuning@2x.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 589 B |
BIN
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Tuning@3x.png
vendored
Normal file
BIN
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_TuningBtn.imageset/Tuning@3x.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 976 B |
21
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_refresh.imageset/Contents.json
vendored
Normal file
21
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_refresh.imageset/Contents.json
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
BIN
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_refresh.imageset/refresh (1).png
vendored
Normal file
BIN
SwiftProject/SwiftProject/Assets.xcassets/customPlayer/custom_refresh.imageset/refresh (1).png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
@ -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)
|
||||
}
|
||||
|
||||
//通过slider进行seek播放时间点
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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 //scale不能小于0.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")
|
||||
}
|
||||
}
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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
|
||||
|
||||
@ -134,3 +134,8 @@
|
||||
"v1.5_submit" = "Submit";
|
||||
"v1.5_menu_lang" = "en";
|
||||
"v1.5_提交中..." = "submiting...";
|
||||
|
||||
//V1.6版本
|
||||
"v1.6_参数设置" = "参数设置";
|
||||
"v1.6_缩放" = "缩放:";
|
||||
"v1.6_瞳距" = "瞳距:";
|
||||
|
||||
@ -134,3 +134,8 @@
|
||||
"v1.5_submit" = "提交";
|
||||
"v1.5_menu_lang" = "zh";
|
||||
"v1.5_提交中..." = "提交中...";
|
||||
|
||||
//V1.6版本
|
||||
"v1.6_参数设置" = "参数设置";
|
||||
"v1.6_缩放" = "缩放:";
|
||||
"v1.6_瞳距" = "瞳距:";
|
||||
|
||||
Loading…
Reference in New Issue
Block a user