From 9dda4671faf768edacc4e052cab215be36e906c7 Mon Sep 17 00:00:00 2001 From: LN Date: Mon, 17 May 2021 14:40:42 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8D=20swift5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Label3D/Label3DView.swift | 75 ++++++++++-------- Label3DTest.xcodeproj/project.pbxproj | 5 ++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++ .../UserInterfaceState.xcuserstate | Bin 0 -> 27114 bytes .../xcschemes/xcschememanagement.plist | 19 +++++ Label3DTest/ViewController.swift | 37 +++++---- 6 files changed, 95 insertions(+), 49 deletions(-) create mode 100644 Label3DTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Label3DTest.xcodeproj/project.xcworkspace/xcuserdata/ln.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Label3DTest.xcodeproj/xcuserdata/ln.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/Label3D/Label3DView.swift b/Label3D/Label3DView.swift index 019a828..ced11b1 100644 --- a/Label3D/Label3DView.swift +++ b/Label3D/Label3DView.swift @@ -19,7 +19,7 @@ public class Label3DView: UIView { */ public override init(frame: CGRect) { super.init(frame: frame) - let panGesture = UIPanGestureRecognizer(target: self, action: "handelPan:") + let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handelPan(gesture:))) self.addGestureRecognizer(panGesture) } @@ -29,24 +29,30 @@ public class Label3DView: UIView { public var perspective:Float = 2000 public var fontSize:CGFloat = 15 - public var fontColor:UIColor = UIColor.blackColor() + public var fontColor:UIColor = UIColor.black public var sphereRadius:Float = 0.5 - public var onEachLabelClicked : ((label:UILabel)->Void)? + public var onEachLabelClicked : ((_ label:UILabel)->Void)? + var titles = [LabelSphere]() public func loadLabelsFromFile(fpath:String) { - if let content = try? String(contentsOfFile: fpath, usedEncoding: nil) { - let lines = content.componentsSeparatedByString("\n") + + do { + let content = try String(contentsOfFile:fpath, encoding: .utf8) + let lines = content.components(separatedBy: "\n") for t in lines { let label = LabelSphere(text: t) - label.textAlignment = .Center + label.textAlignment = .center titles.append(label) } + } catch { + } + } public func resetLabelOnView() { - let PI = Float(M_PI) + let PI = Float(Double.pi) let radius = sphereRadius*perspective let cx = Float(self.frame.width/2) let cy = Float(self.frame.height/2) @@ -62,24 +68,27 @@ public class Label3DView: UIView { sum_circle += c } let dc = Float(titles.count)/sum_circle - var circle_num = [Int](count: circles.count, repeatedValue: 0) + var circle_num = [Int].init(repeating: 0, count: circles.count) + var sum_label = 0 for i in 1 ..< Int(rowNum) { circle_num[i-1] = (Int(dc*circles[i-1]) + 1) sum_label += circle_num[i-1] } - var locLabel = [CGPoint](count:sum_label, repeatedValue: CGPoint()) + + var locLabel = [CGPoint].init(repeating: CGPoint(), count: sum_label) var li = 0 - for (i, cn) in circle_num.enumerate() { + for (i, cn) in circle_num.enumerated() { for j in 0 ..< cn { locLabel[li].y = CGFloat(d_ry * Float(i+1)) - locLabel[li++].x = CGFloat(2*PI/Float(cn)*Float(j)) + locLabel[li].x = CGFloat(2*PI/Float(cn)*Float(j)) + li+=1 } } - for (i, label) in titles.enumerate() { + for (i, label) in titles.enumerated() { label.perspective = perspective - label.font = UIFont.systemFontOfSize(fontSize) + label.font = UIFont.systemFont(ofSize: fontSize) label.textColor = fontColor label.sizeToFit() let rxz = locLabel[i].x @@ -94,18 +103,18 @@ public class Label3DView: UIView { } } // 可以继承该函数,修改旋转速度 - public func panGestureCallback(gesture: UIPanGestureRecognizer) ->(Float,Float) { - let point = gesture.translationInView(self) + public func panGestureCallback(_ gesture: UIPanGestureRecognizer) ->(Float,Float) { + let point = gesture.translation(in: self) let d_rx = Float(point.x/self.frame.width) let d_ry = Float(point.y/self.frame.height) return (d_rx, d_ry) } - func handelPan(gesture: UIPanGestureRecognizer) { + @objc func handelPan(gesture: UIPanGestureRecognizer) { let (d_rx, d_ry) = panGestureCallback(gesture) - scrollX(d_rx) - scrollY(d_ry) + scrollX(th: d_rx) + scrollY(th: d_ry) } // 绕着y轴转,和xz平面的夹角变,但是ry不变 func scrollX(th:Float) { @@ -120,13 +129,13 @@ public class Label3DView: UIView { } } - override public func touchesEnded(touches: Set, withEvent event: UIEvent?) { + public override func touchesEnded(_ touches: Set, with event: UIEvent?) { if let touch = touches.first { - let pos = touch.locationInView(self) + let pos = touch.location(in: self) var zIndex = -Float.infinity var topLabel:UILabel? for l in titles { - if CGRectContainsPoint(l.frame, pos) { + if l.frame.contains(pos) { if Float(l.layer.zPosition) > zIndex { zIndex = Float(l.layer.zPosition) topLabel = l @@ -134,11 +143,11 @@ public class Label3DView: UIView { } } if topLabel != nil { - self.onEachLabelClicked?(label: topLabel!) + self.onEachLabelClicked?(topLabel!) } } - } + } @@ -182,7 +191,7 @@ class LabelSphere: UILabel { let (_, py, pz) = getXYZ() let pyz = sqrt(py*py + pz*pz) let ryz = acos(pz/pyz) - let PI = Float(M_PI) + let PI = Float(Double.pi) if py < 0 { return 2*PI - ryz } else { @@ -197,7 +206,7 @@ class LabelSphere: UILabel { let pxz = sqrt(px*px + pz*pz) ry = acos(py/radius) - let PI = Float(M_PI) + let PI = Float(Double.pi) let new_rxz = acos(pz/pxz) if px < 0 { @@ -238,12 +247,12 @@ class LabelSphere: UILabel { } required init?(coder aDecoder: NSCoder) { - rxz = aDecoder.decodeFloatForKey("rxz") - ry = aDecoder.decodeFloatForKey("ry") - cx = aDecoder.decodeFloatForKey("cx") - cy = aDecoder.decodeFloatForKey("cy") - radius = aDecoder.decodeFloatForKey("radius") - perspective = aDecoder.decodeFloatForKey("perspective") + rxz = aDecoder.decodeFloat(forKey: "rxz") + ry = aDecoder.decodeFloat(forKey: "ry") + cx = aDecoder.decodeFloat(forKey: "cx") + cy = aDecoder.decodeFloat(forKey: "cy") + radius = aDecoder.decodeFloat(forKey: "radius") + perspective = aDecoder.decodeFloat(forKey: "perspective") super.init(coder: aDecoder) } @@ -252,7 +261,7 @@ class LabelSphere: UILabel { self.layer.position.x = CGFloat(sin(rxz) * pxz + cx) let old_pz = self.layer.zPosition self.layer.zPosition = CGFloat(cos(rxz) * pxz) - setTransform3D(self.layer.zPosition - old_pz) + setTransform3D(dz: self.layer.zPosition - old_pz) self.alpha = self.getAlpha() } @@ -278,4 +287,4 @@ class LabelSphere: UILabel { return alpha } -} \ No newline at end of file +} diff --git a/Label3DTest.xcodeproj/project.pbxproj b/Label3DTest.xcodeproj/project.pbxproj index ed9c939..88d9311 100644 --- a/Label3DTest.xcodeproj/project.pbxproj +++ b/Label3DTest.xcodeproj/project.pbxproj @@ -196,6 +196,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, Base, ); @@ -373,6 +374,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = flybywind.Label3DTest; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -386,6 +388,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = flybywind.Label3DTest; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -406,6 +409,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -427,6 +431,7 @@ PRODUCT_BUNDLE_IDENTIFIER = flybywind.Label3D; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; diff --git a/Label3DTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Label3DTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Label3DTest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Label3DTest.xcodeproj/project.xcworkspace/xcuserdata/ln.xcuserdatad/UserInterfaceState.xcuserstate b/Label3DTest.xcodeproj/project.xcworkspace/xcuserdata/ln.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..edab1afb16734566daa3d8079a6a8114e0054c89 GIT binary patch literal 27114 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 + + + + SchemeUserState + + Label3D.xcscheme_^#shared#^_ + + orderHint + 0 + + Label3DTest.xcscheme_^#shared#^_ + + orderHint + 1 + + + + diff --git a/Label3DTest/ViewController.swift b/Label3DTest/ViewController.swift index 33abb87..3fa35ec 100644 --- a/Label3DTest/ViewController.swift +++ b/Label3DTest/ViewController.swift @@ -13,8 +13,8 @@ class ViewController: UIViewController { var label3dView: Label3DView? var labelDescription = [String:String]() - let fm = NSFileManager.defaultManager() - let bundle = NSBundle.mainBundle() + let fm = FileManager.default + let bundle = Bundle.main override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. @@ -25,28 +25,33 @@ class ViewController: UIViewController { let py = (frame.height - height)/2 frame = CGRect(x:px, y:py, width: width, height: height) label3dView = Label3DView(frame: frame) - label3dView?.layer.backgroundColor = UIColor.blackColor().CGColor + label3dView?.layer.backgroundColor = UIColor.black.cgColor self.view.addSubview(label3dView!) - if let fpath = bundle.pathForResource("108", ofType: "txt") { - label3dView?.loadLabelsFromFile(fpath) + if let fpath = bundle.path(forResource: "108", ofType: "txt") { + label3dView?.loadLabelsFromFile(fpath: fpath) label3dView?.perspective = Float(width) - label3dView?.fontColor = UIColor.yellowColor() + label3dView?.fontColor = UIColor.yellow label3dView?.sphereRadius = 0.3 - label3dView?.fontSize = 25 + label3dView?.fontSize = 10//25 label3dView?.onEachLabelClicked = self.clickEachLabel() label3dView?.resetLabelOnView() } - if let fpath = bundle.pathForResource("108.des", ofType: "txt") { - if let content = try? String(contentsOfFile: fpath, usedEncoding: nil) { - let lines = content.componentsSeparatedByString("\n") + if let fpath = bundle.path(forResource: "108.des", ofType: "txt") { + do { + let content = try String(contentsOfFile:fpath, encoding: .utf8) + let lines = content.components(separatedBy: "\n") for l in lines { - let seg = l.componentsSeparatedByString(" ") + let seg = l.components(separatedBy: " ") if seg.count > 1 { labelDescription[seg[1]] = seg[0] } } + } catch { + } + + } } @@ -55,15 +60,15 @@ class ViewController: UIViewController { // Dispose of any resources that can be recreated. } - func clickEachLabel() -> (UILabel->Void){ + func clickEachLabel() -> ((UILabel)->Void){ return {[unowned self] (label:UILabel) in let ac = UIAlertController(title: label.text!, message: self.labelDescription[label.text!], - preferredStyle: .Alert) - ac.addAction(UIAlertAction(title: "确定", style: .Cancel, handler: { + preferredStyle: .alert) + ac.addAction(UIAlertAction(title: "确定", style: .cancel, handler: { [unowned self] _ in - self.dismissViewControllerAnimated(true, completion: nil) + self.dismiss(animated: true, completion: nil) })) - self.presentViewController(ac, animated: true, completion: nil) + self.present(ac, animated: true, completion: nil) } } }