Hide the cursor of an UITextField

后端 未结 13 818
甜味超标
甜味超标 2020-12-07 07:51

I am using a UITextField with a UIPickerView for its inputView, so that when the user taps the text field, a picker is summoned for th

相关标签:
13条回答
  • 2020-12-07 08:39

    set the tintColor to Clear Color

    textfield.tintColor = [UIColor clearColor];
    

    and you can also set from the interface builder

    0 讨论(0)
  • 2020-12-07 08:40

    You can just clear the textfield's tintColor

    self.textField.tintColor = [UIColor clearColor];
    

    Swift 3.0

    self.textField.tintColor = .clear
    

    enter image description here

    0 讨论(0)
  • 2020-12-07 08:40

    You can add a BOOL cursorless property to UITextField in a category via associated objects.

    @interface UITextField (Cursorless)
    
    @property (nonatomic, assign) BOOL cursorless;
    
    @end
    

    Then use method swizzling to swizzle caretRectForPosition: with a method that toggles between CGRectZero and its default value using cursorless.

    This leads to a simple interface via a drop-in category. This is demonstrated in the following files.

    Simply drop them in and get the benefit of this simple interface

    UITextField category: https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless.h https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless.m

    Method Swizzling: https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject%2BRXRuntimeAdditions.h https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject%2BRXRuntimeAdditions.m

    0 讨论(0)
  • 2020-12-07 08:41

    You might also want to stop the user from selecting, copying or pasting any text so that the only text input comes from the picker view.

    - (CGRect) caretRectForPosition:(UITextPosition*) position
    {
        return CGRectZero;
    }
    
    - (NSArray *)selectionRectsForRange:(UITextRange *)range
    {
        return nil;
    }
    
    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
    {
        if (action == @selector(copy:) || action == @selector(selectAll:) || action == @selector(paste:))
        {
            returnNO;
        }
    
        return [super canPerformAction:action withSender:sender];
    }
    

    http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/

    0 讨论(0)
  • 2020-12-07 08:43

    Swift 5 version of Net's post

      override func caretRect(for position: UITextPosition) -> CGRect {
        return .zero
      }
      
      override func selectionRects(for range: UITextRange) -> [UITextSelectionRect] {
        return []
      }
      
      override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
      }
    
    0 讨论(0)
  • 2020-12-07 08:44

    Answer provided by the OP, copied from the question body to help clean up the ever growing tail of unanswered questions.

    I think I have the correct solution but If it can be improved will be welcome :) Well, I made a subclass of UITextField and overriden the method that returns the CGRect for the bounds

    -(CGRect)textRectForBounds:(CGRect)bounds {
        return CGRectZero;
    }
    

    The problem? The text doesn't show because the rect is zero. But I added an UILabel as a subview of the control and overridden the setText method so, as we enter a text as usual, the text field text is nil and is the label which shows the text

    - (void)setText:(NSString *)aText {
        [super setText:nil];
    
        if (aText == nil) {
            textLabel_.text = nil;
        }
    
        if (![aText isEqualToString:@""]) {
            textLabel_.text = aText;
        }
    }
    

    With this the thing works as expected. Have you know any way to improve it?

    0 讨论(0)
提交回复
热议问题