【问题标题】:Custom UIViewController transition where UITableViewCell grows to full screen and back?UITableViewCell 增长到全屏并返回的自定义 UIViewController 转换?
【发布时间】:2014-06-02 11:35:06
【问题描述】:

我无法在网上找到任何此类示例。我怎样才能达到以下效果?在点击表格行时,而不是标准的向左滑动效果,我希望视图控制器转换动画如下所示:

  1. 用户点击表格中的一个单元格
  2. 单元格开始增长以填满屏幕,将其上方和下方的其他行“移出屏幕”。
  3. 随着单元格的增长,单元格元素(文本、图像等)会交叉淡入到新视图的内容中,直到新视图完全填满屏幕。

我还希望能够通过从底部边缘向上拖动以交互方式转换回表格视图,从而实现与上述相反的操作。即,随着“屏幕外”单元格动画回到原位,视图开始收缩回正常的表格视图单元格。

我考虑过拍摄表格的快照并将其在单元格上方和下方的点处拆分,并在屏幕外为这些快照设置动画,作为自定义视图控制器转换的一部分。有没有更好的办法?理想情况下,我不想拍摄快照,因为我可能想要动画等,当它们淡出屏幕时,它们仍在表格视图行中发生。

【问题讨论】:

标签: ios objective-c uitableview uiviewcontroller uicollectionview


【解决方案1】:

首先,我今天看到了你的帖子,他是用 swift 编程语言编写的。 下面的代码是将选中的单元格展开到全屏,子视图会淡出,背景图像会展开。

先完成cellForRowAtIndexPath,然后在didSelectRowAtIndexPath,

    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {

    isSelected = true 
    selectedCellIndex = indexPath.row

    tableView.beginUpdates()

    var cellSelected: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!
    cellSelected.frame = tableCities.rectForRowAtIndexPath(indexPath)

    println("cell frame: \(cellSelected) and center: \(cellSelected.center)")
    let newCell = cellSelected.frame.origin.y - tableOffset
    println("new cell origin: \(newCell)")

    var tempFrame: CGRect = cellSelected.frame
    variableHeight = cellSelected.frame.origin.y - tableOffset
    tempFrame.size.height = self.view.frame.height

    println("contentoffset: \(tableView.contentOffset)")
    let offset = tableView.contentOffset.y
    println("cell tag: \(cellSelected.contentView.tag)")
    let viewCell: UIView? = cellSelected.contentView.viewWithTag(cellSelected.contentView.tag)
    println("label: \(viewCell)")
    viewCell!.alpha = 1

    UIView.animateWithDuration(5.0, delay: 0.1, options: UIViewAnimationOptions.BeginFromCurrentState, animations: {

        tableView.setContentOffset(CGPointMake(0, offset + self.variableHeight), animated: false)
         tableView.contentInset = UIEdgeInsetsMake(0, 0, self.variableHeight, 0)
        tableView.endUpdates()
        cellSelected.frame = tempFrame
        viewCell!.alpha = 0
        println("contentoffset: \(tableView.contentOffset)")



    }, completion: nil)


}

然后将您的 heightForRowAtIndexPath 更新为

     func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

    if isSelected && (selectedCellIndex == indexPath.row) {
        return self.view.frame.height

    }else {
        return 100
    }

}

如果已经解决,请忽略。这可能对其他人有帮助。

【讨论】:

  • 什么是tableOffset和variableHeight变量?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 2016-05-17
  • 1970-01-01
  • 2014-11-19
  • 2016-06-13
相关资源
最近更新 更多