Here's my situation, I have a UIView that is "re-initialized" upon orientation change, and that effectively erases my var farPoints: [(point: CGPoint, type: CGPathElementType)] every time because of the way I have it initialize i believe. so, how can I init it in the init() function only if it's not nil... otherwise, I need a way to keep a variable from being reinitialized when a class is reinitialized.. makes sense? my farPoints contains an array of points I need to maintain when orientation is changed...
import Foundation
import UIKit
import AudioToolbox
class DrawView: UIView
{
var lines: [Line] = []
var lastPoint: CGPoint!
var path = UIBezierPath()
var currentLayer = CAShapeLayer()
var savedPath = UIBezierPath()
var farPath = UIBezierPath()
var degreesOfRotation: CGFloat!
var farPoints: [(point: CGPoint, type: CGPathElementType)]
var tSize: CGSize!
var drawn = false
func DEGREESTORADIANS(_ degrees: CGFloat) -> CGFloat
{
return ((.pi * degrees)/180.0)
}
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.clipsToBounds = true
self.contentMode = .scaleAspectFit
if(self.farPoints == nil)
{
self.farPoints = []
}
degreesOfRotation = 0.0
switch (UserDefaults.standard.integer(forKey: "rotate"))
{
case 1:
degreesOfRotation = 0.0
break
case 2:
degreesOfRotation = 90.0
break
case 3:
degreesOfRotation = -90.0
break
case 4:
degreesOfRotation = 180.0
break
default:
degreesOfRotation = 0.0
break
}
tSize = self.bounds.size
if UserDefaults.standard.bool(forKey:"InvertColors")
{
self.backgroundColor = UIColor.white
print("white")
}
else
{
self.backgroundColor = UIColor.black
}
path = UIBezierPath()
// Custom decoding..
}
func convert_point(point: CGPoint) -> CGPoint
{
var toConvert = CGPoint()
toConvert.x = (point.x - MyManager.shared().activeZone.origin.x ) / MyManager.shared().activeZone.size.width * tSize.width
toConvert.y = (point.y - MyManager.shared().activeZone.origin.y) / MyManager.shared().activeZone.size.height * tSize.height
toConvert = toConvert.rotate(around: self.bounds.center, with: degreesOfRotation)
// boolPoint = true
print("CHECK TWO: \(toConvert) ")
return toConvert
}
func move_began(point: CGPoint)
{
var newPoint = convert_point(point: point)
path.move(to: newPoint)
lastPoint = point
setNeedsDisplay()
}
func move_moved(point: CGPoint)
{
var newPoint = convert_point(point: point)
// lines.append(Line(start: lastPoint, end: newPoint))
drawn = true
path.addLine(to: newPoint)
lastPoint = newPoint
setNeedsDisplay()
}
func ended(point: CGPoint)
{
path.addLine(to: point)
}
override func draw(_ rect: CGRect) {
/* guard let context = UIGraphicsGetCurrentContext() else { return }
context.beginPath()
for line in lines {
context.move(to: line.start)
context.addLine(to: line.end)
}
context.setStrokeColor(UIColor.white.cgColor)
context.strokePath()*/
let center = CGPoint(x: self.bounds.midX, y: self.bounds.midY)
var pathR = UIBezierPath()
pathR = UIBezierPath.init(cgPath: path.cgPath)
// pathR.apply(CGAffineTransform(translationX: center.x, y: center.y).inverted())
pathR.apply(CGAffineTransform(rotationAngle: DEGREESTORADIANS(CGFloat(degreesOfRotation))))
// pathR.apply(CGAffineTransform(translationX: center.x, y: center.x))
if(!UserDefaults.standard.bool(forKey: "DisableVibrations") && MyManager.shared()?.currentPage == DRAWING_MODE && drawn )
{
print("vibrating")
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
currentLayer.contentsScale = self.contentScaleFactor
currentLayer.frame = rect.standardized
var pathNew = UIBezierPath()
pathNew = UIBezierPath.init(cgPath: pathR.cgPath)
if
MyManager.shared()?.currentPage == DRAWING_MODE
{ pathNew = pathNew.fit(into: self.bounds).moveCenter(to: rect.center)
farPath = UIBezierPath()
farPath = UIBezierPath.init(cgPath: pathNew.cgPath)
}
if
MyManager.shared()?.currentPage == DRAWING_MODE
{
currentLayer.path = farPath.cgPath
}
else
{
currentLayer.path = pathR.cgPath
}
if(UserDefaults.standard.bool(forKey: "InvertColors"))
{
self.backgroundColor = UIColor.white
currentLayer.fillColor = UIColor.clear.cgColor
currentLayer.strokeColor = UIColor.black.cgColor
}
else
{
self.backgroundColor = UIColor.black
currentLayer.fillColor = UIColor.clear.cgColor
currentLayer.strokeColor = UIColor.white.cgColor
}
currentLayer.lineWidth = CGFloat(UserDefaults.standard.float(forKey:"lineWidth"))
currentLayer.contentsGravity = CALayerContentsGravity.bottom
savedPath = UIBezierPath(cgPath: currentLayer.path as! CGPath)
self.layer.addSublayer(currentLayer)
}
func a_point(point: CGPoint)
{
farPoints.append((point, CGPathElementType.addLineToPoint))
print("hmm: \(farPoints.count)")
}
func b_point(point: CGPoint)
{
farPoints.append((point, CGPathElementType.moveToPoint))
}
func makeImage(with path: UIBezierPath, size: CGSize) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(size, false, 0)
UIColor.black.setStroke()
path.lineWidth = CGFloat(UserDefaults.standard.float(forKey:"lineWidth"))
path.stroke()
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
func SaveAndClear()
{
if(!drawn) { return }
MyAwesomeAlbum.shared.save(image: makeImage(with: savedPath, size: self.bounds.size) as! UIImage)
print("SHOULD SAVE")
path = UIBezierPath()
setNeedsDisplay()
clear()
}
func clear()
{
path = UIBezierPath()
farPoints = []
setNeedsDisplay()
}
func adjust(TransitionTo tosize: CGSize)
{
path = UIBezierPath()
setNeedsDisplay()
tSize = tosize
print("test: \(self.farPoints.count)")
for i in 0 ..< farPoints.count {
switch (farPoints[i].type.rawValue)
{
case 0:
move_began(point: farPoints[i].point)
break;
case 1:
move_moved(point: farPoints[i].point)
break;
case 2:
break;
default:
break;
}
}
}
}