捕获包含离屏部分的UITableView / ScrollView的屏幕截图不再适用于iOS 13

时间:2020-01-01 16:57:28

标签: ios swift uitableview uiscrollview ios13

由于gleb vodovozov's idea,我可以捕获包括屏幕外部分在内的整个TableView的图像,但是在使用tempView渲染图像后,超级视图不会将TableView恢复为“更改前”的位置。

我已经仔细检查了他的代码,没有发现任何问题。也许只是由于iOS 13的“更改”,现在与以前的iOS版本兼容的代码现在出现了故障?

下面是他的代码

我们非常感谢您的帮助!

var image = UIImage()
    UIGraphicsBeginImageContextWithOptions(self.myTable.contentSize, false, UIScreen.main.scale)

    // save initial values
    let savedContentOffset = self.myTable.contentOffset
    let savedFrame = self.myTable.frame
    let savedBackgroundColor = self.myTable.backgroundColor

    // reset offset to top left point
    self.myTable.contentOffset = CGPoint(x: 0, y: 0)
    // set frame to content size
    self.myTable.frame = CGRect(x: 0, y: 0, width: self.myTable.contentSize.width, height: self.myTable.contentSize.height)
    // remove background
    self.myTable.backgroundColor = UIColor.clear

    // make temp view with scroll view content size
    // a workaround for issue when image on ipad was drawn incorrectly
    let tempView = UIView(frame: CGRect(x: 0, y: 0, width: self.myTable.contentSize.width, height: self.myTable.contentSize.height))

    // save superview
    let tempSuperView = self.myTable.superview
    // remove scrollView from old superview
    self.myTable.removeFromSuperview()
    // and add to tempView
    tempView.addSubview(self.myTable)

    // render view
    // drawViewHierarchyInRect not working correctly
    tempView.layer.render(in: UIGraphicsGetCurrentContext()!)
    // and get image
    image = UIGraphicsGetImageFromCurrentImageContext()!

    // and return everything back
    tempView.subviews[0].removeFromSuperview()
    tempSuperView?.addSubview(self.myTable)

    // restore saved settings
    self.myTable.contentOffset = savedContentOffset
    self.myTable.frame = savedFrame
    self.myTable.backgroundColor = savedBackgroundColor

    UIGraphicsEndImageContext()

    return image

1 个答案:

答案 0 :(得分:0)

// remove scrollView from old superview
self.myTable.removeFromSuperview()

来自documentation

func removeFromSuperview():调用此方法将删除所有与要删除的视图有关的约束,或与要删除的视图的子树中的任何视图有关的约束。

我知道您要还原框架,但是您可能需要先在数组中保存约束,然后再从超级视图中删除它,然后在将其再次添加到超级视图中之后再次添加它们。

// Save constraints
guard let superView = myTable.superView else {
   return
}
var oldConstraints: [NSLayoutConstraint] = []
for constraint in superView.constraints {
   if constraint.firstItem == myTable || constraint.secondItem == myTable {
       oldConstraints.append(constraint)
   }
}

self.myTable.removeFromSuperview()

// ...

tempSuperView?.addSubview(self.myTable)

// Restore old constraints
NSLayoutConstraint.activate(oldConstraints)
相关问题