【问题标题】:drawTextInRect on UITextField not called未调用 UITextField 上的 drawTextInRect
【发布时间】:2010-12-27 14:33:21
【问题描述】:

我正在尝试实现this SO question 的答案。问题是:-[drawTextInRect] 显然没有被调用,并且在-[drawRect] 中设置阴影不会使 UITextField 的文本被遮蔽。

另一件奇怪的事情是,即使我的 -[drawTextInRect]-[drawRect] 的子类实现完全为空(甚至没有调用 super),文本字段的文本也会被绘制。

【问题讨论】:

    标签: iphone drawing uitextfield subclass shadow


    【解决方案1】:

    这是UITextField API 文档中的一个错误。文档表明覆盖drawTextInRect: 可用于自定义行为。事实并非如此。

    事实上,drawTextInRect: 永远不会在 UITextField 上被调用(顺便说一句,drawPlaceholderInRect: 也不会被调用)。

    另见http://discussions.apple.com/thread.jspa?threadID=1727596

    覆盖UILabel 上的方法虽然有效。

    【讨论】:

    • 更正:drawPlaceholderInRect: 仍然被调用。我在我的子类中使用它来更改占位符的字体和文本颜色。
    【解决方案2】:

    我猜你要找的方法是:

    - (CGRect)textRectForBounds:(CGRect)bounds
    

    或者可能

    - (CGRect)editingRectForBounds:(CGRect)bounds
    

    【讨论】:

      【解决方案3】:

      我注意到 -[drawTextInRect] 在 UITextField 失去焦点时被调用一次。不是我想要的。

      【讨论】:

        【解决方案4】:

        UITextField 不响应- drawTextInRect: 消息。您引用的页面上的代码子类是UILabel 而不是UITextField,这就是它不适合您的原因。

        【讨论】:

          【解决方案5】:

          如果您不调用 super,编译器可能会在优化您的代码期间删除该方法。实际上意味着 UILabel 的实现正在被调用。


          更新: 如果您使用笔尖创建文本字段,请确保已将笔尖中文本字段的类设置为您的自定义子类,否则将不会调用您的自定义代码。

          【讨论】:

          • 只是阅读你的最后一行并让你知道为什么它不能用于测试目的:另一个奇怪的事情是,即使我的 -[drawTextInRect] 和 -[drawRect] 的子类实现是完全空的(甚至不是对 super 的调用),文本字段的文本被绘制。
          • 如果你不调用 super 它更像是重写一个方法并提供一个自定义实现——在这种情况下,一个方法不会改变默认行为。对于这种情况,编译器没有理由通过删除子类中的空方法实现来“优化”代码。免责声明:我没有投反对票:)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-24
          • 2011-10-29
          • 2018-07-31
          • 1970-01-01
          相关资源
          最近更新 更多