【问题标题】:UITextField ellipsis in the middle of user input, Swift用户输入中间的 UITextField 省略号,Swift
【发布时间】:2021-10-29 18:50:00
【问题描述】:

UITextField 中间可以有省略号吗?我找到的每个答案都是针对 UITextView 的。在我的应用程序中,我有文本字段,用户可以在其中粘贴他钱包的私钥,但它太长了,最后会被三个点切割,这是我想要实现的,因为在私钥中,最重要的字符是第一个很少和最后几个,有这样的东西:firstfewchar...lastfewchar

【问题讨论】:

  • 您有什么建议吗?与文本字段最相似的是什么? @Sweeper 问题是,该文本字段在我们的整个应用程序中,我们需要遵循设计,解决此问题的最佳方法是什么?
  • 我能想到的一种方法是,当用户停止编辑UITextField 时,在其顶部放置一个UILabel,并设置lineBreakMode。另一个想法是使用this answer,但将byClipping 替换为byTruncatingMiddle。我不确定这是否可行。
  • 我刚试过,这个答案确实有效。 :)

标签: ios swift uitextfield ellipsis


【解决方案1】:

this answer的启发,您应该创建自己的自定义UITextField子类,并将文本字段的属性文本的换行模式设置为.byTruncatingMiddle

class MyTextField: UITextField {
    override var text: String? {
        didSet {
            makeTextTruncateInMiddle()
        }
    }
    
    private func makeTextTruncateInMiddle() {
        guard let newAttributedText = (attributedText?.mutableCopy() as? NSMutableAttributedString) else {
            return
        }
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineBreakMode = .byTruncatingMiddle
        newAttributedText.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedText?.length ?? 0))
        attributedText = newAttributedText
    }
    
    override func resignFirstResponder() -> Bool {
        makeTextTruncateInMiddle()
        return super.resignFirstResponder()
    }
}

当用户停止编辑文本字段时,将应用换行模式:

【讨论】:

  • 覆盖文本时出现错误:“不支持从扩展中覆盖非@objc 声明”
  • @miki 您应该创建自己的文本字段子类,而不是扩展。
  • @miki 顺便说一句,我在回答中没有说过要使用扩展名。
【解决方案2】:

我认为您可以通过执行以下步骤来实现这一目标

  1. 为您的文本字段设置委托方法。
  2. 创建一个新的字符串属性来存储用户粘贴的原始值。
  3. 定义自己的文本剪切规则,当用户停止编辑时,将文本字段的当前文本替换为剪切的文本。
  4. 当用户开始编辑时,将剪切的文本替换为原始文本。

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多