Dynamic paging with UITextView

Viewed 1134

I am trying to create dynamic paging scrolling from left to right with UITextView. I've implemented a code using this tutorial : http://sketchytech.blogspot.com/2013/11/paging-and-paginating-easy-way-with.html

Here's my code:

let pageNumber: CGFloat = 4.0

override func viewDidLoad() {

    super.viewDidLoad()
    let scrollingView = UIScrollView(frame: CGRect(x: CGFloat(20), y: CGFloat(20), width: CGFloat(view.bounds.size.width - 20), height: CGFloat(view.bounds.size.height - 20)))
    scrollingView.contentSize = CGSize(width: CGFloat((view.bounds.size.width - 20) * pageNumber), height: CGFloat(view.bounds.size.height - 20))
    scrollingView.isPagingEnabled = true
    view.addSubview(scrollingView)

    let textString = "NOW, what I want is, Facts.  Teach these boys and girls nothing but Facts.  Facts alone are wanted in life.  Plant nothing else, and root out everything else.  You can only form the minds of reasoning animals upon Facts: nothing else will ever be of any service to them.  This is the principle on which I bring up my own children, and this is the principle on which I bring up these children.  Stick to Facts, sir!’ The scene was a plain, bare, monotonous vault of a school-room, and the speaker’s square forefinger emphasized his observations by underscoring every sentence with a line on the schoolmaster’s sleeve.  The emphasis was helped by the speaker’s square wall of a forehead, which had his eyebrows for its base, while his eyes found commodious cellarage in two dark caves, overshadowed by the wall.  The emphasis was helped by the speaker’s mouth, which was wide, thin, and hard set.  The emphasis was helped by the speaker’s voice, which was inflexible, dry, and dictatorial.  The emphasis was helped by the speaker’s hair, which bristled on the skirts of his bald head, a plantation of firs to keep the wind from its shining surface, all covered with knobs, like the crust of a plum pie, as if the head had scarcely warehouse-room for the hard facts stored inside.  The speaker’s obstinate carriage, square coat, square legs, square shoulders,—nay, his very neckcloth, trained to take him by the throat with an unaccommodating grasp, like a stubborn fact, as it was,—all helped the emphasis. ‘In this life, we want nothing but Facts, sir; nothing but Facts!’ The speaker, and the schoolmaster, and the third grown person present, all backed a little, and swept with their eyes the inclined plane of little vessels then and there arranged in order, ready to have imperial gallons of facts poured into them until they were full to the brim."

    let textStorage = NSTextStorage(string: textString)
    let textLayout = NSLayoutManager()
    textStorage.addLayoutManager(textLayout)
    textLayout.delegate = self

    var i: Int = 0
    while i <= 4 {
        let textContainer = NSTextContainer(size: scrollingView.frame.size)
        textLayout.addTextContainer(textContainer)
        let textView = UITextView(frame: CGRect(x: CGFloat(scrollingView.frame.size.width * CGFloat(i)), y: CGFloat(0), width: CGFloat(scrollingView.frame.size.width), height: CGFloat(scrollingView.frame.size.height)), textContainer: textContainer)
        textView.font = .systemFont(ofSize: 25)
        textView.tag = i
        scrollingView.addSubview(textView)
        i += 1
    }
}

func layoutManager(_ layoutManager: NSLayoutManager, didCompleteLayoutFor textContainer: NSTextContainer?, atEnd layoutFinishedFlag: Bool) {

    print("called")
}

The only problem is the number of page is limited here or user defined static value. But what if I want to change the font size to 30 then extra page will be needed. In the tutorial at the end it says, "In order to add the dynamic element, you need to take advantage of the NSLayoutManager delegate methods." I read the documentation of NSLayoutManger and found layoutManager(_:didCompleteLayoutFor:atEnd:) is the perfect fit for paginating which I have added in my code but not sure how to take advantage of it. Can anyone tell me how can I make the textview dynamic with the change of fontSize it'll automatically adjust the number of pages it requires?

1 Answers
Related