drawTextInRect on UITextField not called

2019-01-15 00:46发布

问题:

I'm trying to implement the answer to this SO question. The problem is: -[drawTextInRect] is apparently not called, and setting the shadow in -[drawRect] doesn't make the UITextField's text shadowed.

Another weird thing is that even if my subclass implementations of -[drawTextInRect] and -[drawRect] are completely empty (not even a call to super), the textfield's text is drawn.

回答1:

This is a bug in the UITextField API documentation. The documentation indicates that overriding drawTextInRect: can be used to customize behaviour. This is not the case.

In fact, drawTextInRect: will never be called on an UITextField (drawPlaceholderInRect: will be called neither by the way).

See also http://discussions.apple.com/thread.jspa?threadID=1727596.

Overriding the method on UILabel works though.



回答2:

I guess the method you are looking for is:

- (CGRect)textRectForBounds:(CGRect)bounds

or possibly

- (CGRect)editingRectForBounds:(CGRect)bounds


回答3:

I note that -[drawTextInRect] is called once when the UITextField loses focus. Not what I wanted.



回答4:

UITextField does not respond to a - drawTextInRect: message. The code on the page you reference subclasses a UILabel not a UITextField, which is why it didn't work for you.



回答5:

If you don't call super, the compiler might be removing the method during optimization of your code. Effectively meaning that UILabel's implementation is getting called.


Update: If you are using a nib to create the textfield, be sure you have set the class of the textfield in the nib to your custom subclass, otherwise your custom code will not be called.