如何让TextView能够水平滚动

时间:2015-10-29 06:31:44

标签: ios swift uiscrollview uitextview

我知道TextView已嵌入ScrollView。如果有相当长的String (其中不包含"\n"

根据TextView的宽度,TextView会自动执行换行。

如果TextView的高度很短,那么我们就可以垂直滚动它。 你如何禁用自动换行?这样,如果没有" \ n"遭遇,它没有换行。相反,它允许用户水平滚动以查看文本。

我该如何实现?

4 个答案:

答案 0 :(得分:4)

我知道如何做到这一点有很多帮助你们:D,谢谢,我们走了!

1。所以,首先,我们需要一个longlonglong String,对吗?

let displayStr = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 "

2. 假设我们有一个UIScrollView,它由@IBOutlet链接或通过调用.viewWithTag(xxx)得到。我们将其命名为scroll

3。现在是时候获取字符串的大小,这是我们将要使用的关键功能:

哦!我几乎忘了定义我们将使用哪种字体(这是一个至关重要的参数),以及我们字符串的 max-size 是什么大小

let maxSize = CGSizeMake(9999, 9999)
let font = UIFont(name: "Menlo", size: 16)!
//key function is coming!!!
let strSize = (displayStr as NSString).boundingRectWithSize(maxSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName : font], context: nil)

4. 好的,现在我们可以把字符串放到textView中,你需要以编程方式创建一个新的UITextView,这样我们就可以定义与字符串& #39;尺寸(哦,也许更大一些:D):

let frame = CGRectMake(0, 0, size.width+50, size.height+10)
let textView = UITextView(frame: frame)
textView.editable = false
textView.scrollEnabled = false//let textView becomes unScrollable
textView.font = font
textView.text = displayStr

5。返回我们的scroll,我们会设置其contentSize

scroll.contentSize = CGSizeMake(size.width, size.height)

6。最后,addSubview:     scroll.addSubview(textView)

  

你可以看到,textView嵌入了一个scrollView,允许它   滚动2个方向。

     

B.T.W。我的工具只是一个演示   静态字符串。如果您希望用户使用不会排队的textView   如果他没有输入任何" \ n",你可能需要动态计算   字符串大小。 :d

[我希望这会有所帮助]

答案 1 :(得分:0)

  1. [myTextView setContentSize:CGSizeMake(width, myTextView.frame.size.height)];
  2. 内容的宽度超出了textView框架的宽度,否则就不会滚动。

    1. 关闭UITextView上的所有滚动选项,然后将其嵌入另一个UIScrollViewReference:- DualScrollTextView

答案 2 :(得分:0)

@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var textView: UITextView!

var yourText: String = "Whatever your text is going to be." 

override func viewDidLayoutSubviews() {

    super.viewDidLayoutSubviews()
    self.scrollView.layoutIfNeeded()
    self.scrollView.contentSize = self.textView.bounds.size

}


override func viewDidLoad() {
    super.viewDidLoad()

textView.text = yourText

    textView.sizeThatFits(CGSizeMake(textView.frame.size.width, 80)) //height to equal the actual size of your text view.

}

我认为这应该即插即用,但我确信textView.sizeThatFits可行。您必须确保将文本视图约束到其父卷轴视图才能使其正常工作。 (领先,尾随,顶部,底部和高度。)

答案 3 :(得分:0)

可接受的答案不适用于AutoLayout,因此我将分享我的方法:

1。。添加一个带有UITextView的UIScrollView,并将所有边缘固定为两个边缘

2。。为UITextView添加宽度和高度限制(与设置它们的大小无关)

3。。为UITextView,高度约束和宽度约束创建IBOutlets

4。。在TextView上取消选中“滚动启用”

5。。更新文本时,计算文本的边界大小并使用边界大小更新高度和宽度约束

@IBOutlet weak var textView: UITextView!
@IBOutlet weak var textViewHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var textViewWidthConstraint: NSLayoutConstraint!

let displayText = "Your text here."

override func viewDidLoad() {
    super.viewDidLoad()

    let maxSize = CGSize(width: 10000, height: 30000)
    let textRect = displayText.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes: [.font : self.textView.font!], context: nil)

    self.textView.text = displayText
    self.textViewHeightConstraint.constant = textRect.height
    self.textViewWidthConstraint.constant = textRect.width
}

更新:我发现这种方法使用大量内存来存储大量文本(我发现已使用超过1GB)。这是我将内存影响从 1GB减少到100MB 的方法:

1。。像上面的步骤1一样设置边缘约束。

2。。为TextView添加可滚动内容宽度的宽度约束(我使用了2000,但是您可以根据自己的喜好进行调整,越宽越会占用更多的内存)

3。。添加约束以使TextView和ScrollView具有相等的高度

就是这样!可滚动的宽度将保持不变,并且一旦您为TextView设置了文本,可滚动的高度就会自动调整。

注意:这种方法的一些注意事项:

  • 可滚动宽度将始终是您设置的宽度,但是如果要根据文本调整大小,则可以将混合方法与第一种解决方案结合使用
  • 您将看不到垂直滚动条(除非您一直向右滚动),但是可以通过调整TextView的滚动条插图来找回。

参考:https://www.ralfebert.de/ios-examples/auto-layout/uiscrollview-storyboard/