获取对象x / y坐标+ NSTimer因未知原因而崩溃

时间:2014-10-26 16:38:07

标签: swift coordinates nstimer

  1. 是否有命令获取对象的x / y坐标?另外,无论如何都要获得屏幕中心的坐标?

  2. 我正在尝试使用NSTimer每秒添加一个CircleView,但它会意外崩溃。

    var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector(view.addSubview(circleView)), userInfo: nil, repeats: true)
    

    这是传递给circleView的{​​{1}}:

    Selector(view.addSubview(circleView))

    它崩溃了:

    var circleWidth = CGFloat(200)
    var circleHeight = circleWidth
    // Create a new CircleView
    var circleView = CircleView(frame: CGRectMake(200, 0, circleWidth, circleHeight))
    

1 个答案:

答案 0 :(得分:2)

首先,是的,您可以轻松获得任何x的{​​{1}} / y位置;它也很容易获得屏幕中心的坐标。

UIView的位置(在UIView的坐标系中)位于:

superview

注意: view.frame.origin 位于origin的左上角。

屏幕中心可以这样确定:

UIView

您可能希望let screenBounds = UIScreen.mainScreen().bounds let centerOfScreen = CGPoint(x: CGRectGetMidX(screenBounds), y: CGRectGetMidY(screenBounds)) 的中心重新添加新视图,但这几乎相同,只需将UIView替换为UIScreen.mainScreen().boundsview.bounds是您view添加新视图的地方。

其次,你的计时器崩溃了,因为你给它一个无效的UIView。你不能通过直接传递函数来创建Selector,你需要传递一个Selector,其中包含你想要它指向的函数的名称。当你这样做时:

String

您实际上是立即调用Selector(view.addSubview(circleView)) 并将其返回的值传递给view.addSubview(circleView)。由于Selector返回addSubview,您实际上创建的Void指向Selector,这是无效的。当nil触发时,它会尝试拨打NSTimer nil并崩溃。

执行代码尝试的正确方法是创建一个新功能,添加Selector并将该功能的名称传递给CircleView

Selector

然后像这样设置func addCircleView() { var circleWidth = CGFloat(200) var circleHeight = circleWidth // Create a new CircleView var circleView = CircleView(frame: CGRectMake(200, 0, circleWidth, circleHeight)) view.addSubview(circleView) }

NSTimer

注意:您实际上并不需要var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("addCircleView"), userInfo: nil, repeats: true) Selector,Swift会发现您需要"addCircleView"在那里并自动将字符串文字转换为它。