我知道TextView
已嵌入ScrollView
。如果有相当长的String
(其中不包含"\n"
)
根据TextView
的宽度,TextView
会自动执行换行。
如果TextView
的高度很短,那么我们就可以垂直滚动它。
你如何禁用自动换行?这样,如果没有" \ n"遭遇,它没有换行。相反,它允许用户水平滚动以查看文本。
我该如何实现?
答案 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)
[myTextView setContentSize:CGSizeMake(width, myTextView.frame.size.height)];
内容的宽度超出了textView框架的宽度,否则就不会滚动。
UIScrollView
。 Reference:- 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设置了文本,可滚动的高度就会自动调整。
注意:这种方法的一些注意事项:
参考:https://www.ralfebert.de/ios-examples/auto-layout/uiscrollview-storyboard/