Ios 在方向更改时维护UITextView的contentOffset

Ios 在方向更改时维护UITextView的contentOffset,ios,uitextview,Ios,Uitextview,是否可以更改UITextView的内容偏移量,以便当用户从纵向移动到横向(反之亦然)时,他们可以看到的文本保持不变 因此,如果用户处于(纵向模式) 移动到风景,它应该是 ....some text....some text2.... ....I'm here....more text.... //this is the visible area ..... UITextView不可编辑,但可滚动。这里有一个简短、自包含、可编译的示例: import UIKit class ViewContr

是否可以更改UITextView的内容偏移量,以便当用户从纵向移动到横向(反之亦然)时,他们可以看到的文本保持不变

因此,如果用户处于(纵向模式)

移动到风景,它应该是

....some text....some text2....
....I'm here....more text.... //this is the visible area
.....

UITextView不可编辑,但可滚动。

这里有一个简短、自包含、可编译的示例:

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
    }

}
其思想是根据旋转前的高度获得滚动内容的数量(
viewwilltransitionosize
),并在旋转后使用它计算新的
contentOffset
viewdilayoutsubviews
在大小更改后也被调用)


请记住,这并不能给出100%的精确结果,但我还没有找到更好的结果,也许这对您来说就足够了。

我刚刚测试过它,似乎
UITextView
会自动为您实现这一点。你能描述一下你的问题吗?我在滚动视图中使用文本视图。在scroll上,我必须再次布局视图,以便它们尊重视图大小。但当我这样做时,textview的滚动位置会改变。因此,我只想知道是否有可能找到用户当前的滚动位置(相对),并在方向改变时手动设置
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
    }

}