先打一个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"
|
filePath = "SwiftProject/Project/Util/ZZHImageExtension.swift"
|
||||||
startingColumnNumber = "9223372036854775807"
|
startingColumnNumber = "9223372036854775807"
|
||||||
endingColumnNumber = "9223372036854775807"
|
endingColumnNumber = "9223372036854775807"
|
||||||
startingLineNumber = "72"
|
startingLineNumber = "79"
|
||||||
endingLineNumber = "72"
|
endingLineNumber = "79"
|
||||||
landmarkName = "getRotateFrom()"
|
landmarkName = "getRotateFrom(_:)"
|
||||||
landmarkType = "7">
|
landmarkType = "7">
|
||||||
<Locations>
|
<Locations>
|
||||||
<Location
|
<Location
|
||||||
@ -438,6 +438,21 @@
|
|||||||
endingLineNumber = "72"
|
endingLineNumber = "72"
|
||||||
offsetFromSymbolStart = "616">
|
offsetFromSymbolStart = "616">
|
||||||
</Location>
|
</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>
|
</Locations>
|
||||||
</BreakpointContent>
|
</BreakpointContent>
|
||||||
</BreakpointProxy>
|
</BreakpointProxy>
|
||||||
@ -601,5 +616,37 @@
|
|||||||
landmarkType = "7">
|
landmarkType = "7">
|
||||||
</BreakpointContent>
|
</BreakpointContent>
|
||||||
</BreakpointProxy>
|
</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>
|
</Breakpoints>
|
||||||
</Bucket>
|
</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 temScale:CGFloat = 1.0
|
||||||
var currentScale:CGFloat = 1.0//当前缩放值
|
var currentScale:CGFloat = 1.0//当前缩放值
|
||||||
var currentED:Int = 5//当前的瞳距
|
var currentED:Int = 5//当前的瞳距
|
||||||
|
let userdefaultValueKey_scale = "userdefaultValueKey_scale"
|
||||||
|
let userdefaultValueKey_ed = "userdefaultValueKey_ed"
|
||||||
|
|
||||||
//ui
|
//ui
|
||||||
var playerLayerBgView:UIView?
|
var playerLayerBgView:UIView?
|
||||||
var avPlayer:AVPlayer?
|
var avPlayer:AVPlayer?
|
||||||
var avPlayerLayer:AVPlayerLayer?
|
var avPlayerLayer:AVPlayerLayer?
|
||||||
var timeSlider:ZZHCustomSlider?
|
var timeSlider:ZZHCustomSlider?
|
||||||
|
var edBtn:UIButton? //瞳距调节按钮
|
||||||
|
|
||||||
var prePlayingState:Bool = true {//标记 在滑块拖动前,player的播放状态,以便在拖动完毕之后回复播放状态
|
var prePlayingState:Bool = true {//标记 在滑块拖动前,player的播放状态,以便在拖动完毕之后回复播放状态
|
||||||
didSet {
|
didSet {
|
||||||
if(prePlayingState){
|
if(prePlayingState){
|
||||||
@ -82,6 +87,10 @@ class ZZHCustomPlayer: UIView {
|
|||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
print("zzhcustomplayer deinit......")
|
print("zzhcustomplayer deinit......")
|
||||||
|
UserDefaults.standard.setValue(currentScale, forKey: self.userdefaultValueKey_scale )
|
||||||
|
UserDefaults.standard.setValue(currentED, forKey: self.userdefaultValueKey_ed)
|
||||||
|
UserDefaults.standard.synchronize()
|
||||||
|
|
||||||
releaseVideoComposition()
|
releaseVideoComposition()
|
||||||
assetReader?.cancelReading()
|
assetReader?.cancelReading()
|
||||||
NotificationCenter.default.removeObserver(self)
|
NotificationCenter.default.removeObserver(self)
|
||||||
@ -94,6 +103,23 @@ class ZZHCustomPlayer: UIView {
|
|||||||
|
|
||||||
override init(frame: CGRect) {
|
override init(frame: CGRect) {
|
||||||
super.init(frame: frame)
|
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)
|
NotificationCenter.default.addObserver(self, selector: #selector(notification_PlayerEndTime(notification:)), name: AVPlayerItem.didPlayToEndTimeNotification, object: nil)
|
||||||
|
|
||||||
let playerWidth = KScreenWidth
|
let playerWidth = KScreenWidth
|
||||||
@ -137,10 +163,30 @@ class ZZHCustomPlayer: UIView {
|
|||||||
self.addSubview(timeSlider!)
|
self.addSubview(timeSlider!)
|
||||||
timeSlider!.snp.makeConstraints { make in
|
timeSlider!.snp.makeConstraints { make in
|
||||||
make.left.equalToSuperview().offset(24)
|
make.left.equalToSuperview().offset(24)
|
||||||
make.right.equalToSuperview().offset(-24)
|
// make.right.equalToSuperview().offset(-24)
|
||||||
make.bottom.equalToSuperview().offset(0)
|
make.bottom.equalToSuperview().offset(0)
|
||||||
make.height.equalTo(120)
|
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播放时间点
|
//通过slider进行seek播放时间点
|
||||||
|
|||||||
@ -56,7 +56,7 @@ extension ZZHCustomPlayer {
|
|||||||
|
|
||||||
func convertFrame(request:AVAsynchronousCIImageFilteringRequest){
|
func convertFrame(request:AVAsynchronousCIImageFilteringRequest){
|
||||||
let compositionTime = request.compositionTime
|
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)
|
// let tr = CMTimeRange(start: compositionTime, end: end)
|
||||||
|
|
||||||
var ciImg:CIImage? = nil
|
var ciImg:CIImage? = nil
|
||||||
@ -72,7 +72,8 @@ extension ZZHCustomPlayer {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ciImg = self.otherModeImgWithMode(mode: self.selectedIndex,compositionTime: compositionTime)
|
ciImg = self.otherModeImgWithMode(mode: self.selectedIndex,compositionTime: compositionTime)
|
||||||
guard let ciImg else {print("未合成成功.....,此处将进行重新构建assetoutput,然后再次重拾")
|
guard let ciImg else {
|
||||||
|
print("未合成成功.....,此处将进行重新构建assetoutput,然后再次重拾")
|
||||||
quickLoadAReaderWhenSeek(startCT: compositionTime)
|
quickLoadAReaderWhenSeek(startCT: compositionTime)
|
||||||
ciImg = self.otherModeImgWithMode(mode: self.selectedIndex,compositionTime: compositionTime)
|
ciImg = self.otherModeImgWithMode(mode: self.selectedIndex,compositionTime: compositionTime)
|
||||||
break
|
break
|
||||||
@ -97,7 +98,7 @@ extension ZZHCustomPlayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var ciImg:CIImage? = nil
|
var ciImg:CIImage? = nil
|
||||||
var presentTime:CMTime? = nil
|
// var presentTime:CMTime? = nil
|
||||||
switch mode {
|
switch mode {
|
||||||
case .crossedEyes://交叉眼
|
case .crossedEyes://交叉眼
|
||||||
ciImg = self.videoTranserConvertor.convertVideo(asset: self.videoOriginalAsset, assetOutput: ao, type: self.selectedIndex, time: compositionTime,scale: currentScale,ed:currentED)
|
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 sLabel:UILabel?
|
||||||
var eLabel:UILabel?
|
var eLabel:UILabel?
|
||||||
var timeSlider:CustomSlider?
|
var timeSlider:CustomSlider?
|
||||||
|
|
||||||
var processChangeValueCallback:CustomSliderProcessChangeValueCallback?
|
var processChangeValueCallback:CustomSliderProcessChangeValueCallback?
|
||||||
var preValue:Float = 0.0 //更新进度前的value
|
var preValue:Float = 0.0 //更新进度前的value
|
||||||
var totalSec:Int = -1//代表视频总时长
|
var totalSec:Int = -1//代表视频总时长
|
||||||
@ -29,7 +30,7 @@ class ZZHCustomSlider: UIView {
|
|||||||
bgView.snp.makeConstraints { make in
|
bgView.snp.makeConstraints { make in
|
||||||
make.left.right.equalToSuperview()
|
make.left.right.equalToSuperview()
|
||||||
make.centerY.equalToSuperview()
|
make.centerY.equalToSuperview()
|
||||||
make.height.equalTo(28)
|
make.height.equalTo(38)
|
||||||
}
|
}
|
||||||
|
|
||||||
timeSlider = CustomSlider()
|
timeSlider = CustomSlider()
|
||||||
@ -47,7 +48,7 @@ class ZZHCustomSlider: UIView {
|
|||||||
bgView.addSubview(eLabel!)
|
bgView.addSubview(eLabel!)
|
||||||
sLabel?.snp.makeConstraints({ make in
|
sLabel?.snp.makeConstraints({ make in
|
||||||
make.left.equalTo(timeSlider!.snp.left)
|
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()
|
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 {
|
func joinImages( leftImage:CIImage, rightImage:CIImage,scale:CGFloat,ed:Int) -> CIImage {
|
||||||
// let scale = 1.0 //缩放参数,此处必须大于0.5
|
//缩放参数,此处必须大于0.5
|
||||||
// let ed = 5 //瞳距参数,暂定 瞳距与像素点的比例为1:2,瞳距的值范围为 -30 ~ +30 之间的整数
|
//瞳距参数,暂定 瞳距与像素点的比例为1:2,瞳距的值范围为 -30 ~ +30 之间的整数
|
||||||
let edS = 30 //比列
|
let edS = 30 //比列
|
||||||
|
|
||||||
let left = UIImage(ciImage: leftImage )
|
let left = UIImage(ciImage: leftImage )
|
||||||
@ -191,7 +191,7 @@ class PlayByTransferConvertor {
|
|||||||
|
|
||||||
//获取调整了瞳距的图片
|
//获取调整了瞳距的图片
|
||||||
let x_offset = CGFloat(abs(ed) * edS) //关于瞳距的x偏移量
|
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 imageHeight = left.size.height
|
||||||
let ed_left = getImgWithED(image: n_left, imgWidth: imageWidth)
|
let ed_left = getImgWithED(image: n_left, imgWidth: imageWidth)
|
||||||
let ed_right = getImgWithED(image: n_right, imgWidth: imageWidth)
|
let ed_right = getImgWithED(image: n_right, imgWidth: imageWidth)
|
||||||
@ -205,7 +205,7 @@ class PlayByTransferConvertor {
|
|||||||
}
|
}
|
||||||
else if (ed < 0) {
|
else if (ed < 0) {
|
||||||
ed_left.draw(in: CGRect(x:x_offset, y:0, width:imageWidth, height:imageHeight))
|
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 {//瞳距没有改变的情况
|
else {//瞳距没有改变的情况
|
||||||
ed_left.draw(in: CGRect(x:0, y:0, width:imageWidth, height:imageHeight))
|
ed_left.draw(in: CGRect(x:0, y:0, width:imageWidth, height:imageHeight))
|
||||||
|
|||||||
@ -7,9 +7,16 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import UIKit
|
import UIKit
|
||||||
|
import CoreImage
|
||||||
extension UIImage {
|
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? {
|
// func rotate( radians: CGFloat) -> UIImage? {
|
||||||
// // 计算旋转角度对应的弧度
|
// // 计算旋转角度对应的弧度
|
||||||
// let radians = radians * CGFloat.pi / 180
|
// let radians = radians * CGFloat.pi / 180
|
||||||
|
|||||||
@ -134,3 +134,8 @@
|
|||||||
"v1.5_submit" = "Submit";
|
"v1.5_submit" = "Submit";
|
||||||
"v1.5_menu_lang" = "en";
|
"v1.5_menu_lang" = "en";
|
||||||
"v1.5_提交中..." = "submiting...";
|
"v1.5_提交中..." = "submiting...";
|
||||||
|
|
||||||
|
//V1.6版本
|
||||||
|
"v1.6_参数设置" = "参数设置";
|
||||||
|
"v1.6_缩放" = "缩放:";
|
||||||
|
"v1.6_瞳距" = "瞳距:";
|
||||||
|
|||||||
@ -134,3 +134,8 @@
|
|||||||
"v1.5_submit" = "提交";
|
"v1.5_submit" = "提交";
|
||||||
"v1.5_menu_lang" = "zh";
|
"v1.5_menu_lang" = "zh";
|
||||||
"v1.5_提交中..." = "提交中...";
|
"v1.5_提交中..." = "提交中...";
|
||||||
|
|
||||||
|
//V1.6版本
|
||||||
|
"v1.6_参数设置" = "参数设置";
|
||||||
|
"v1.6_缩放" = "缩放:";
|
||||||
|
"v1.6_瞳距" = "瞳距:";
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user