UIView将无法在ViewDidLoad上正确移动

@IBOutlet var box: UIView! var lastLocation:CGPoint = CGPointMake(200,400) //arbitrary value that will change override func viewDidLoad() { super.viewDidLoad() box.center = lastLocation lastLocation = box.center } @IBAction func detectPan(sender: UIPanGestureRecognizer) { var translation = sender.translationInView(self.view!) box.center = CGPointMake(lastLocation.x + translation.x, lastLocation.y + translation.y) println(box.center) if(sender.state == UIGestureRecognizerState.Ended) { lastLocation = box.center } } 

每当代码收到一个平移手势框将适当移动,但viewDidLoad()框将不会重新定位到给定的位置。 在IB中,它被设置在左上angular,最后的位置将会改变,所以我不能简单地在IB中移动框。 我将如何使viewDidLoad框移动到正确的位置?

问题是你的子视图是 viewDidLoad 之后展开的 ,所以如果你 viewDidLoad设置你的IB子视图的位置,那么在视图出现之前,它将被重新定位到故事板中的框架。 所以我build议将viewDidLoad的代码移动到viewDidLayoutSubviews然后添加一个dispatch_once块或条件来确保代码只在第一次调用viewDidLayoutSubviews运行,例如:

 override func viewDidLayoutSubviews() { func doOnce() { struct Token { static var token: dispatch_once_t = 0; } dispatch_once(&Token.token) { self.box.center = lastLocation self.lastLocation = box.center } } doOnce() } 

要么

 var subviewsLaidout = false override func viewDidLayoutSubviews() { if subviewsLaidout == false { subviewsLaidout = true box.center = lastLocation lastLocation = box.center } }