Checking if UITableViewCell is completely visible in Swift

791 Views Asked by At

I am using Parse to store users who have videos and then display their videos in a PFQueryTableViewController (subclasses UITableViewController I believe). I want only the video that is in the TableViewCell which is completely visible to automatically play but I'm having difficulty making the right video play. I looked for solutions but everything was in Objective-C, and my attempts to use the solutions in Swift were unsuccessful. Here is my code:

override func scrollViewDidScroll(scrollView: UIScrollView) {
    var cells = self.tableView.visibleCells()
    var indexPaths = self.tableView.indexPathsForVisibleRows()!

    if (cells.count == 1) {
        self.checkVisibilityOfCell(cells[0] as! UsersTableViewCell, forIndexPath: indexPaths[0] as! NSIndexPath)
    } else if (cells.count == 2) {
        self.checkVisibilityOfCell(cells[1] as! UsersTableViewCell, forIndexPath: indexPaths[1] as! NSIndexPath)
    } else if (cells.count > 2) {
        for i in 1...(cells.count - 1) {
            (cells[i] as! UsersTableViewCell).completelyVisible = true
        }
    }
}

func checkVisibilityOfCell(cell : UsersTableViewCell, forIndexPath : NSIndexPath){
    var cellRect : CGRect = self.tableView.rectForRowAtIndexPath(forIndexPath)
    cellRect = self.tableView.superview!.convertRect(cellRect, fromView: self.tableView)
    var completelyVisible : Bool = self.tableView.frame.contains(cellRect)
    cell.completelyVisible = completelyVisible
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {
    var cell : UsersTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as? UsersTableViewCell

    if(cell == nil) {
        cell = UsersTableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: cellIdentifier)
    }

    if let pfObject = object {
        let otherUser = pfObject as! PFUser
        cell?.userDisplayed = otherUser
        if (cell?.completelyVisible == true) {
            // Video playing
            println("\(cell?.userDisplayed!.username!) is completely visible")
            var video1 = pfObject["video1"] as? PFFile
            let video1URL = NSURL(string: (video1?.url)!)
            objMoviePlayerController = MPMoviePlayerController(contentURL: video1URL)
            objMoviePlayerController.movieSourceType = MPMovieSourceType.Unknown
            objMoviePlayerController.view.frame = (cell?.userVideo1.bounds)!
            objMoviePlayerController.scalingMode = MPMovieScalingMode.AspectFit
            objMoviePlayerController.controlStyle = MPMovieControlStyle.None
            objMoviePlayerController.repeatMode = MPMovieRepeatMode.One
            objMoviePlayerController.shouldAutoplay = true
            cell?.userVideo1.addSubview(objMoviePlayerController.view)
            objMoviePlayerController.prepareToPlay()
            objMoviePlayerController.play()
        } else {
            println("\(cell?.userDisplayed!.username!) is not completely visible")
        }
    }
    return cell
}

Since some videos do play, I suspect that one or both of the functions scrollViewDidScroll or checkVisibilityOfCell is incorrect. Any help would be appreciated!

0

There are 0 best solutions below