我在ViewController中有一个滑块sliderLineSize
和一个变量lineSize
。UISlidersliderLineSize
改变lineSize
。但是,lineSize
实际上用于附加到UIView的drawRect
类的viewLine
部分。
问题:
如何将ViewController中设置的变量lineSize
传递到viewLine
中使用它的类drawRect
?
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myView: UIView!
@IBOutlet weak var myImageView: UIImageView!
var lineSize: Int = 1
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
myImageView.alpha = 0.5
}
@IBAction func sliderLineSize(sender: UISlider) {
lineSize = Int(sender.value)
}
}
class viewLine: UIView {
let path=UIBezierPath()
var incrementalImage:UIImage?
var previousPoint:CGPoint = CGPoint.zero
var strokeColor:UIColor?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func drawRect(rect: CGRect) {
incrementalImage?.drawInRect(rect)
path.lineWidth = lineSize
path.stroke()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
let touch: AnyObject? = touches.first
let currentPoint = touch!.locationInView(self)
path.moveToPoint(currentPoint)
previousPoint=currentPoint
self.setNeedsDisplay()
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
let touch: AnyObject? = touches.first
let currentPoint = touch!.locationInView(self)
let midPoint = self.midPoint(previousPoint, p1: currentPoint)
path.addQuadCurveToPoint(midPoint,controlPoint: previousPoint)
previousPoint=currentPoint
path.moveToPoint(midPoint)
self.setNeedsDisplay()
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.drawBitmap()
self.setNeedsDisplay()
path.removeAllPoints()
}
func midPoint(p0:CGPoint,p1:CGPoint)->CGPoint {
let x=(p0.x+p1.x)/2
let y=(p0.y+p1.y)/2
return CGPoint(x: x, y: y)
}
func drawBitmap() {
UIGraphicsBeginImageContextWithOptions(self.bounds.size, true, 1)
strokeColor?.setStroke()
if((incrementalImage) == nil){
let rectPath:UIBezierPath = UIBezierPath(rect: self.bounds)
UIColor.whiteColor().setFill()
rectPath.fill()
}
incrementalImage?.drawAtPoint(CGPointZero)
path.stroke()
incrementalImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
}
}
最佳答案
有两种主要的方法。
选项1:
为您的ViewLine
类提供自己的lineSize
属性:
class ViewLine: UIView {
var lineSize = 1
}
为
ViewController
提供对ViewLine
的引用,并在viewLine
中更改时使用属性观察员更新ViewController
中的属性:class ViewController: UIViewController {
// v~~~ be sure to connect this outlet in interface builder
@IBOutlet weak var viewLine: ViewLine!
var lineSize = 1 {
didSet {
viewLine.lineSize = lineSize
}
}
}
现在,您的
ViewLine
类将拥有自己的lineSize
属性,可以从其drawRect
方法中直接访问该属性。选择2:
给您的
ViewLine
类引用ViewController
:class ViewLine: UIView {
// v~~~ be sure to connect this outlet in interface builder
@IBOutlet weak var controller: ViewController!
}
现在,在
drawRect
方法中,用path.lineWidth = lineSize
替换path.lineWidth = controller.lineSize
。基本上,一个类需要一个对另一个的引用,以便它们能够进行通信。
关于ios - 从Swift中的另一个类访问ViewController中的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35346014/