尝试注释 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 移动我想要的方向。不过,这似乎违反直觉。

就是这样。我希望这会对某人有所帮助。