touchesBegan和touchesMoved没有被UIView触发

时间:2017-02-21 08:36:23

标签: ios swift uiview uiviewcontroller touchesbegan

我想要实现的目标:

尝试抓取屏幕上当前触摸区域的坐标,并在屏幕上绘制接收到的坐标。简单地说,一个基本的绘图应用程序,所有这些都是以编程方式编写的(对于我自己的实践)。

问题

touchesBegantouchesMoved PaintingSubclass根本没有被调用。

当前设置

  • 我有PaintingViewController然后我还有PaintingSubclass

  • PaintingViewControllerUIViewControllerPaintingSubclassUIView

  • PaintingViewController创建PaintingSubclass的实例,并将其添加到PaintingViewController子视图

  • PaintingSubclass是实际绘图的地方。

到目前为止我尝试了什么

  • touchesMoved内加一个断点并触及开始(不起作用)
  • 尝试添加UITapGestureRecognizer (无效)
  • 已启用self.isUserInteractionEnabled = true (无效)
  • PaintingSubclass继承UIControl并在sendActions(for: .valueChanged)touchesMoved (无效)结束时致电touchesBegan

当前代码

(请忽略任何不必要的变量)

import UIKit

class PaintingViewController: UIViewController{

var _paintView: PaintingSubclass? = nil

override func loadView() {
    view = UILabel()
}

private var labelView: UILabel {
    return view as! UILabel
}

override func viewDidLoad() {

    _paintView = PaintingSubclass()
    _paintView?.frame = CGRect(x: view.bounds.minX, y: view.bounds.minY, width: 400, height: 750)
    _paintView?.backgroundColor = UIColor.white
    _paintView?.setNeedsDisplay()

    view.addSubview(_paintView!)
}

class PaintingSubclass: UIView{

    private var context: CGContext? = nil
    var styleSelection: String = "buttcap"
    var linewidth: Float = 5
    var lineCapStyle: CGLineCap? = nil
    var lineJoinStyle: CGLineJoin? = nil
    var lineWidthValue: CGFloat? = nil
    var colorValue: UIColor? = nil

    override init(frame: CGRect) {
        super.init(frame: frame)
        lineWidthValue = 0.5
        colorValue = UIColor(cgColor: UIColor.black.cgColor)
        self.isUserInteractionEnabled = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func draw(_ rect: CGRect) {

        context = UIGraphicsGetCurrentContext()!
        context?.move(to: CGPoint(x: 0.0, y: 110.0))
        context?.setStrokeColor((colorValue?.cgColor)!)
        context?.drawPath(using: CGPathDrawingMode.stroke)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        let touch: UITouch = touches.first!
        let touchPoint: CGPoint = touch.location(in: self)

        let _xValue = touchPoint.x
        let _yValue = touchPoint.y

        NSLog("coordinate: \(_xValue), \(_yValue)")
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesMoved(touches, with: event)

        let touch: UITouch = touches.first!
        let touchPoint: CGPoint = touch.location(in: self)

        let _xValue = touchPoint.x
        let _yValue = touchPoint.y

        NSLog("coordinate: \(_xValue), \(_yValue)")
    }   
}
}

我在这里做错了什么?被困在这个州几个小时没有取得任何进展。任何帮助/反馈将不胜感激。

4 个答案:

答案 0 :(得分:1)

根据您的代码,您的PaintingViewController视图是UILabel,属性isUserInteractionEnabled默认为false。尝试将此属性设置为true可能对您有所帮助。

答案 1 :(得分:1)

我不知道您为什么要将默认视图设置为UILabel(),但isUserInteractionEnabled的默认view为false。将其设置为true

override func loadView() {
    view = UILabel()
    view.isUserInteractionEnabled = true
}

答案 2 :(得分:1)

问题在于:

//    override func loadView() {
//        view = UILabel()
//    }
//    
//    private var labelView: UILabel {
//        return view as! UILabel
//    }

将视图控制器的自我视图对象转换为UILabel对象。

答案 3 :(得分:0)

最好将绘画视图作为视图控制器中的主视图,将UILabel作为绘画视图的子视图。 UILabel需要在当前布局中使用userInteractionEnabled,而不是更改那个切换布局。

除了其他任何事情,大概你不希望绘画视图在标签上绘制,而是要在顶部绘制标签,因此标签应该是子视图。