我在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/

10-10 04:01