尝试注释 MapView 并同时加载第二个视图控制器
Trying to Annotate a MapView and Load a second View Controller Simultaneously
在我的主视图控制器中,我有一个 MKMapView 和 TableView。 tableview 使用 AlamoFire 调用 API 用户信息来填充其单元格。
我希望发生的事情:
当您 select 一个单元格时,第二个容器视图(具有更详细的用户信息)将进入 tableview 所在的屏幕部分。同时,地图视图将用该用户的位置进行注释。
问题:
当单元格被 selected 时,第二个容器视图滑到屏幕上(好),地图注释(好),但随后信息容器视图再次消失(坏)。第二次点击最初的 selected 单元格,信息容器视图将滑回屏幕并保留下来。我需要摆脱这种双击。
地图注释似乎出于某种原因否定了这个过程。当我注释掉地图注释时,VC 过渡效果很好……只需轻轻一按。
任何想法都会有所帮助。
这是有问题的代码:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.localTableView.deselectRowAtIndexPath(indexPath, animated: true)
dispatch_async(dispatch_get_main_queue(),{
self.populateInfoContainerView(indexPath.row)
self.mapView.selectAnnotation(self.users[indexPath.row], animated: true)
if(self.userInfoContainerView.frame.origin.x == UIScreen.mainScreen().bounds.size.width){
self.showInfoView(true)
} else {
self.hideInfoView(true)
}
})
}
func showInfoView(animated: Bool){
UIView.animateWithDuration(0.33, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 1.0, options: UIViewAnimationOptions.CurveEaseInOut, animations: ({
self.userInfoContainerView.frame.origin.x = 0
self.localTableView.frame.origin.x = -UIScreen.mainScreen().bounds.size.width
}), completion: { finished in
//animation complete
})
self.infoVisible = true
}
func hideInfoView(animated: Bool){
let xPos = UIScreen.mainScreen().bounds.size.width
if(animated == true){
UIView.animateWithDuration(0.25, animations: ({
self.userInfoContainerView.frame.origin.x = xPos
self.localTableView.frame.origin.x = 0
}), completion: { finished in
//animation complete
})
} else {
self.userInfoContainerView.frame.origin.x = xPos
}
self.infoVisible = false
}
谢谢。
我相信我已经找到了答案。我不确定为什么这行得通而上面的版本不行,但我会告诉你我做了什么不同。
我现在正在为 TableView 和 InfoView 的约束设置动画。
首先,我 ctrl+click+将约束从我的 main.storyboard 拖到我的代码中,并创建了一个 IBOutlet 来制作动画。我还添加了一个 let screenWidth
作为我将它们移动的常量。
@IBOutlet weak var infoViewLeadingEdge: NSLayoutConstraint!
@IBOutlet weak var tableViewXCenter: NSLayoutConstraint!
let screenWidth = UIScreen.mainScreen().bounds.size.width
然后我把上面的代码替换成showInfo()
:
self.userInfoContainerView.frame.origin.x = 0
self.localTableView.frame.origin.x = -UIScreen.mainScreen().bounds.size.width
使用这个新代码:
self.infoViewLeadingEdge.constant -= self.screenWidth
self.tableViewXCenter.constant += self.screenWidth
self.view.layoutIfNeeded()
在我上面的 hideInfo()
中,我替换了这个:
self.userInfoContainerView.frame.origin.x = xPos
self.localTableView.frame.origin.x = 0
使用这个新代码:
self.infoViewLeadingEdge.constant += self.screenWidth
self.tableViewXCenter.constant -= self.screenWidth
self.view.layoutIfNeeded()
别忘了self.view.layoutIfNeeded()
。如果您不使用该代码,动画将无法运行。此外,tableViewXCenter 上的 += 和 -= 似乎与我希望 table 执行的操作相反,但是,这是我需要放置它们以获得 table 移动我想要的方向。不过,这似乎违反直觉。
就是这样。我希望这会对某人有所帮助。
在我的主视图控制器中,我有一个 MKMapView 和 TableView。 tableview 使用 AlamoFire 调用 API 用户信息来填充其单元格。
我希望发生的事情: 当您 select 一个单元格时,第二个容器视图(具有更详细的用户信息)将进入 tableview 所在的屏幕部分。同时,地图视图将用该用户的位置进行注释。
问题: 当单元格被 selected 时,第二个容器视图滑到屏幕上(好),地图注释(好),但随后信息容器视图再次消失(坏)。第二次点击最初的 selected 单元格,信息容器视图将滑回屏幕并保留下来。我需要摆脱这种双击。
地图注释似乎出于某种原因否定了这个过程。当我注释掉地图注释时,VC 过渡效果很好……只需轻轻一按。
任何想法都会有所帮助。
这是有问题的代码:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.localTableView.deselectRowAtIndexPath(indexPath, animated: true)
dispatch_async(dispatch_get_main_queue(),{
self.populateInfoContainerView(indexPath.row)
self.mapView.selectAnnotation(self.users[indexPath.row], animated: true)
if(self.userInfoContainerView.frame.origin.x == UIScreen.mainScreen().bounds.size.width){
self.showInfoView(true)
} else {
self.hideInfoView(true)
}
})
}
func showInfoView(animated: Bool){
UIView.animateWithDuration(0.33, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 1.0, options: UIViewAnimationOptions.CurveEaseInOut, animations: ({
self.userInfoContainerView.frame.origin.x = 0
self.localTableView.frame.origin.x = -UIScreen.mainScreen().bounds.size.width
}), completion: { finished in
//animation complete
})
self.infoVisible = true
}
func hideInfoView(animated: Bool){
let xPos = UIScreen.mainScreen().bounds.size.width
if(animated == true){
UIView.animateWithDuration(0.25, animations: ({
self.userInfoContainerView.frame.origin.x = xPos
self.localTableView.frame.origin.x = 0
}), completion: { finished in
//animation complete
})
} else {
self.userInfoContainerView.frame.origin.x = xPos
}
self.infoVisible = false
}
谢谢。
我相信我已经找到了答案。我不确定为什么这行得通而上面的版本不行,但我会告诉你我做了什么不同。
我现在正在为 TableView 和 InfoView 的约束设置动画。
首先,我 ctrl+click+将约束从我的 main.storyboard 拖到我的代码中,并创建了一个 IBOutlet 来制作动画。我还添加了一个 let screenWidth
作为我将它们移动的常量。
@IBOutlet weak var infoViewLeadingEdge: NSLayoutConstraint!
@IBOutlet weak var tableViewXCenter: NSLayoutConstraint!
let screenWidth = UIScreen.mainScreen().bounds.size.width
然后我把上面的代码替换成showInfo()
:
self.userInfoContainerView.frame.origin.x = 0
self.localTableView.frame.origin.x = -UIScreen.mainScreen().bounds.size.width
使用这个新代码:
self.infoViewLeadingEdge.constant -= self.screenWidth
self.tableViewXCenter.constant += self.screenWidth
self.view.layoutIfNeeded()
在我上面的 hideInfo()
中,我替换了这个:
self.userInfoContainerView.frame.origin.x = xPos
self.localTableView.frame.origin.x = 0
使用这个新代码:
self.infoViewLeadingEdge.constant += self.screenWidth
self.tableViewXCenter.constant -= self.screenWidth
self.view.layoutIfNeeded()
别忘了self.view.layoutIfNeeded()
。如果您不使用该代码,动画将无法运行。此外,tableViewXCenter 上的 += 和 -= 似乎与我希望 table 执行的操作相反,但是,这是我需要放置它们以获得 table 移动我想要的方向。不过,这似乎违反直觉。
就是这样。我希望这会对某人有所帮助。