【问题标题】:Capture a screenshot of UITableView/ScrollView including offscreen parts is no longer works with iOS 13捕获 UITableView/ScrollView 的屏幕截图,包括屏幕外部分不再适用于 iOS 13
【发布时间】:2020-04-20 14:08:51
【问题描述】:

感谢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

【问题讨论】:

    标签: ios swift uitableview uiscrollview ios13


    【解决方案1】:
    // 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)
    

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多