swift ——多行文字前面内容省略

本文详细介绍了iOS中的lineBreakMode属性在处理文本过长时的不同截断选项,如按单词或字符换行,并提供了如何根据容器宽度和字体分割多行文本以及实现特定省略策略的代码示例。

首先来说一说ios中的 lineBreakMode
lineBreakMode : 设置文字过长时的显示截断样式

可选值如下

  • byWordWrapping : 以单词为单位换行,以单词为单位截断。
  • byCharWrapping :以字符为单位换行,以字符为单位截断。
  • byClipping : 以单词为单位换行,以字符为单位截断。
  • byTruncatingHead : 以单词为单位换行, 如果是单行,则开始部分有省略号。如果是多行,则中间有省略号。
  • byTruncatingTail : 以单词为单位换行, 无论是单行还是多行,都是末尾有省略号。
  • byTruncatingMiddle : 以单词为单位换行, 无论是单行还是多行,都是中间有省略号。

 三种省略方式如下


byTruncatingHead为头部截断,但是文字为多行时省略的是中间内容而不是头部内容,下面我们就来实现多行文字,文字超过设定行数后省略头部的功能

首先根据容器的宽度和字体的大小计将文本分割成多行

func splitTextIntoLines(text: String, width: CGFloat, font: UIFont) -> [String] {
        let textBox = CGSize(width: width, height: 
### 设置 UITextField 支持多行输入 `UITextField` 默认情况下仅支持单行输入,若需实现多行输入功能,需要结合 `UITextView` 或使用自定义方案。以下是具体实现方法: #### 使用 UITextView 实现多行输入 由于 `UITextField` 本身不支持多行显示,通常推荐使用 `UITextView` 来替代其功能,并通过设置其属性来实现多行输入需求。 ```swift let textView = UITextView() textView.isScrollEnabled = false // 禁止滚动以适应多行内容 textView.font = UIFont.systemFont(ofSize: 14) textView.textContainer.maximumNumberOfLines = 0 // 允许无限行数 textView.textContainer.lineBreakMode = .byWordWrapping // 按单词换行 textView.layer.borderColor = UIColor.lightGray.cgColor textView.layer.borderWidth = 1.0 textView.delegate = self ``` 此外,可以通过添加占位符文本(placeholder)提升用户体验,例如在 `XYUITextView` 中实现类似 `UITextField` 的占位提示功能,具体做法是通过设置 `_placeholderLabel` 属性并将其添加到视图中 [^2]。 #### 自定义 UITextField 多行输入 虽然 `UITextField` 不直接支持多行输入,但可通过调整其 `intrinsicContentSize` 并结合 `UILabel` 或 `UITextView` 实现类似效果。然而,这种做法较为复杂且容易引发布局问题,因此不建议采用。 #### 示例代码:基于 UITextView 的多行输入组件 ```swift class XYUITextView: UITextView { var placeholder: String? { willSet { let placeholderLabel = UILabel() placeholderLabel.text = newValue placeholderLabel.numberOfLines = 0 placeholderLabel.textColor = .lightGray placeholderLabel.font = UIFont(name: "PingFang SC", size: 14) addSubview(placeholderLabel) setValue(placeholderLabel, forKey: "_placeholderLabel") } } override init(frame: CGRect, textContainer: NSTextContainer?) { super.init(frame: frame, textContainer: textContainer) commonInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) commonInit() } private func commonInit() { isScrollEnabled = false textContainer.maximumNumberOfLines = 0 textContainer.lineBreakMode = .byWordWrapping } } ``` 在界面中使用时可如下所示: ```swift let textView = XYUITextView() textView.placeholder = "请输入文字" textView.frame = CGRect(x: 20, y: 100, width: view.bounds.width - 40, height: 100) textView.backgroundColor = .yellow view.addSubview(textView) ``` #### 注意事项 - `UITextView` 是 `UIScrollView` 类型的子类,因此默认不会捕获所有交互事件,而 `UITextField` 作为 `UIControl` 类型则具备更强的事件响应能力 [^3]。 - 若需更复杂的多行输入逻辑,如自动高度调整、动态占位符等,建议参考 SwiftUI 的 `TextEditor` 组件实现方式 [^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值