programing

UI 텍스트 필드의 커서 숨기기

jooyons 2023. 6. 19. 21:28
반응형

UI 텍스트 필드의 커서 숨기기

는 사용중다니입을 .UITextFieldUIPickerView그것 때문에inputView사용자가 텍스트 필드를 누르면 선택사항을 선택할 수 있도록 선택기가 호출됩니다.

거의 모든 것이 작동하지만 한 가지 문제가 있습니다. 사용자가 텍스트 필드에 입력하지 않을 것으로 예상되고 키보드가 표시되지 않기 때문에 커서가 활성 상태일 때 텍스트 필드에서 계속 깜박입니다. 이는 보기 흉하고 부적절합니다.나는 이것을 설정함으로써 교묘하게 해결할 수 있다는 것을 압니다.editingNO텍스트 필드 및 해당 필드에 대한 추적 터치 또는 사용자 지정 선택 단추로 대체하고 코드를 통해 선택기를 호출합니다.하지만, 나는 그것을 사용하고 싶습니다.UITextFieldDelegate텍스트 필드의 모든 이벤트 처리 방법 및 텍스트 필드를 단추로 바꾸는 것과 같은 해킹은 이 접근 방식을 허용하지 않습니다.

어떻게 하면 간단히 커서를 숨길 수 있습니까?UITextField대신에?

하위 클래스 UITextField 및 carrectForPosition을(를) 재정의합니다.

- (CGRect)caretRectForPosition:(UITextPosition *)position
{
    return CGRectZero;
}

iOS 7을 할 수 있습니다.tintColor = [UIColor clearColor]textField에서 캐럿이 사라집니다.

텍스트 필드의 색조를 지우기만 하면 됩니다.색상

self.textField.tintColor = [UIColor clearColor];

스위프트 3.0

self.textField.tintColor = .clear

enter image description here

또한 선택기 보기에서 텍스트 입력만 수행하도록 사용자가 텍스트를 선택, 복사 또는 붙여넣기를 중지할 수도 있습니다.

- (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으로 표시합니다.

textField.selectedTextRange = nil; // hides caret

캐럿 숨기기 취소

다음 두 가지 방법으로 캐럿을 숨깁니다.

  1. 텍스트 필드의 선택한 텍스트 범위를 문서의 끝으로 설정합니다.

    UITextPosition *end = textField.endOfDocument;
    textField.selectedTextRange = [textField textRangeFromPosition:end
                                                        toPosition:end];
    
  2. 캐럿을 동일한 위치에 유지하려면 먼저 텍스트 필드의 선택한 텍스트 범위를 인스턴스 변수에 저장합니다.

    _textFieldSelectedTextRange = textField.selectedTextRange;
    textField.selectedTextRange = nil; // hides caret
    

    그런 다음 캐럿을 숨기려면 텍스트 필드의 선택한 텍스트 범위를 원래의 텍스트 범위로 다시 설정합니다.

    textField.selectedTextRange     = _textFieldSelectedTextRange;
    _textFieldLastSelectedTextRange = nil;
    

넷의 게시물의 스위프트 5 버전

  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
  }

OP가 제공한 답변은 답변이 계속 증가하는 미답변 질문을 정리하는 데 도움이 되도록 질문 본문에서 복사한 것입니다.

는 또: 서브클래스 입니해을찾니: 하클스다래다다위른.UIButton 이러한 합니다.

- (UIView *)inputView {
    return inputView_;
}

- (void)setInputView:(UIView *)anInputView {
    if (inputView_ != anInputView) {
        [inputView_ release];
        inputView_ = [anInputView retain];
    }
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

버튼은 , 이제,.UIResponder와 비슷한 행동을 합니다.UITextField그리고 구현은 매우 간단합니다.

색조 색상을 색상 지우기로 설정

textfield.tintColor = [UIColor clearColor];

인터페이스 빌더에서 설정할 수도 있습니다.

만약 여러분이 커서를 숨기고 싶다면, 이것을 쉽게 사용할 수 있습니다!제게 효과가 있었습니다.

[[textField valueForKey:@"textInputTraits"] setValue:[UIColor clearColor] forKey:@"insertionPointColor"]

OP가 제공한 답변은 답변이 계속 증가하는 미답변 질문을 정리하는 데 도움이 되도록 질문 본문에서 복사한 것입니다.

올바른 솔루션을 가지고 있다고 생각하지만 개선할 수 있다면 환영할 것입니다 :) 글쎄요, 저는 UITextField의 하위 클래스를 만들고 경계에 대한 CGRect를 반환하는 메서드를 재정의했습니다.

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

문제는?직사각형이 0이기 때문에 텍스트가 표시되지 않습니다.그러나 UI 레이블을 컨트롤의 하위 보기로 추가하고 setText 메서드를 재정의하여 일반적으로 텍스트를 입력할 때 텍스트 필드 텍스트는 0이고 텍스트를 표시하는 레이블입니다.

- (void)setText:(NSString *)aText {
    [super setText:nil];

    if (aText == nil) {
        textLabel_.text = nil;
    }

    if (![aText isEqualToString:@""]) {
        textLabel_.text = aText;
    }
}

이것으로 일은 예상대로 진행됩니다.당신은 그것을 개선할 방법을 알고 있습니까?

커서와 메뉴를 모두 비활성화하려면 다음 두 가지 방법으로 하위 클래스를 사용합니다.

- (CGRect)caretRectForPosition:(UITextPosition *)position {
    return CGRectZero;
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    [UIMenuController sharedMenuController].menuVisible = NO;
    self.selectedTextRange = nil;

    return NO;
}

저는 그저 하위 클래스입니다.UITextField 및오라드이버드를 재정의합니다.layoutSubviews다음과 같이:

- (void)layoutSubviews
{
    [super layoutSubviews];
    for (UIView *v in self.subviews)
    {
        if ([[[v class] description] rangeOfString:@"UITextSelectionView"].location != NSNotFound)
        {
            v.hidden = YES;
        }
    }
}

이것은 더러운 해킹이며, 미래에 실패할 수도 있습니다(커서가 다시 표시될 것입니다 - 앱이 충돌하지 않을 것입니다). 하지만 작동합니다.

cleaner = less code를 좋아하면 인터페이스 빌더를 사용합니다.

Clear color

(속성 검사기, 섹션 보기)

제 경우에는 캐럿을 무시하는 것만으로는 충분하지 않았습니다.iOS 15에서는 캐럿이 효과적으로 나타나지 않았지만 선택 핸들이 표시되었습니다.

했습니다.override var canBecomeFirstResponder: Bool { return false }UITextView 하위 클래스에 있습니다.

추가할 수 있습니다.BOOL cursorlessUITextField연결된 개체를 통해 범주에 포함됩니다.

@interface UITextField (Cursorless)

@property (nonatomic, assign) BOOL cursorless;

@end

그런 다음 방법 스위즐링을 사용하여 스위즐링합니다.caretRectForPosition:사이를 전환하는 방법으로CGRectZero다음을 사용하여 기본값으로 설정합니다.cursorless.

이는 드롭인 범주를 통해 간단한 인터페이스로 이어집니다.이는 다음 파일에서 확인할 수 있습니다.

이 단순한 인터페이스를 사용하여 사용자에게 제공할 수 있습니다.

UITextField 카테고리: https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless.hhttps ://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless.m

방법 스위즐링: https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject%2BRXRuntimeAdditions.h https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject%2BRXRuntimeAdditions.m

언급URL : https://stackoverflow.com/questions/3699727/hide-the-cursor-of-a-uitextfield

반응형