使用UITextView进行动态分页 [英] Dynamic paging with UITextView

查看:71
本文介绍了使用UITextView进行动态分页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用UITextView创建从左到右的动态分页滚动.我已经使用本教程实现了代码: http://sketchytech.blogspot.com/2013/11/paging-paginating-easy-way-with.html

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

这是我的代码:

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")
}

唯一的问题是此处的页数受到限制或用户定义的静态值.但是,如果我想将字体大小更改为30,那将需要额外的页面.在最后的教程中,它说:为了添加动态元素,您需要利用NSLayoutManager委托方法."我阅读了NSLayoutManger的文档,发现layoutManager(_:didCompleteLayoutFor:atEnd :)非常适合分页,我已在代码中添加了分页,但不确定如何利用它.谁能告诉我如何通过更改fontSize使其动态化,从而自动调整所需的页面数?

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?

推荐答案

我认为您会发现它比预期的要容易-而且您甚至不需要 NSLayoutManagerDelegate :

I think you'll find it's easier than expected - and you don't even need the NSLayoutManagerDelegate:

override func viewDidLoad() {

    super.viewDidLoad()

    let scrollingView = UIScrollView(frame: CGRect(x: CGFloat(20), y: CGFloat(20), width: CGFloat(view.bounds.size.width - 40), height: CGFloat(view.bounds.size.height - 40)))

    // we will set the contentSize after determining how many pages get filled with text
    //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 r = CGRect(x: 0, y: 0, width: scrollingView.frame.size.width, height: scrollingView.frame.size.height)

    var i: Int = 0

    // this is what we'll use to track the "progress" of filling the "screens of textviews"
    // each time through, we'll get the last Glyph rendered...
    // if it's equal to the total number of Glyphs, we know we're done
    var lastRenderedGlyph = 0

    while lastRenderedGlyph < textLayout.numberOfGlyphs {

        let textContainer = NSTextContainer(size: scrollingView.frame.size)
        textLayout.addTextContainer(textContainer)

        let textView = UITextView(frame: r, textContainer: textContainer)

        r.origin.x += r.width

        textView.font = .systemFont(ofSize: 25)

        textView.tag = i

        i += 1

        scrollingView.addSubview(textView)

        // get the last Glyph rendered into the current textContainer
        lastRenderedGlyph = NSMaxRange(textLayout.glyphRange(for: textContainer))

    }

    // use the last textView rect to set contentSize
    scrollingView.contentSize = CGSize(width: r.origin.x, height: r.size.height)

    print("Actual number of pages =", i)
}

试着改变字体大小并更改实际文本...您应该 看到页数自动被填充.

Play around with changing the font size, and changing the actual text... you should see the page-count automatically being filled.

这篇关于使用UITextView进行动态分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆