这里有一个简短的、独立的、可编译的示例:
import UIKit
class ViewController: UIViewController {
var textView: UITextView!
var percentOfScroll:CGFloat = 0
override func viewDidLoad() {
self.textView = UITextView(frame: CGRectZero)
self.textView.layer.borderColor = UIColor.blackColor().CGColor
self.textView.layer.borderWidth = 1
self.textView.editable = false
self.textView.text = "Lorem ipsum... some longish text"
self.view.addSubview(self.textView)
let leftConstraint = NSLayoutConstraint(item: self.textView, attribute: .Leading, relatedBy: .Equal, toItem: self.view, attribute: .Leading, multiplier: 1, constant: 10)
let rightConstraint = NSLayoutConstraint(item: self.textView, attribute: .Trailing, relatedBy: .Equal, toItem: self.view, attribute: .Trailing, multiplier: 1, constant: -10)
let topConstraint = NSLayoutConstraint(item: self.textView, attribute: .Top, relatedBy: .Equal, toItem: self.view, attribute: .Top, multiplier: 1, constant: 44)
let centerConstraint = NSLayoutConstraint(item: self.textView, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: 0)
self.textView.translatesAutoresizingMaskIntoConstraints = false
self.view.addConstraints([leftConstraint, rightConstraint, topConstraint, centerConstraint])
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let contentSize = self.textView.contentSize
let newOffset = contentSize.height * percentOfScroll
self.textView.contentOffset = CGPoint(x: 0, y: newOffset)
}
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
let contentSize = self.textView.contentSize
let contentOffset = self.textView.contentOffset
self.percentOfScroll = contentOffset.y / contentSize.height
}
}
这个想法是在旋转前(viewWillTransitionToSize)获取滚动内容与其高度相关的数量,并在之后使用它计算新的contentOffset(viewDidLayoutSubviews 在大小更改后也被调用)。
请记住,这并不能给出 100% 精确的结果,但我无法想出更好的结果,也许这对你来说就足够了。