[ios] UITextField에 텍스트 삽입?

나는 삽입 된하고자하는 텍스트 의를UITextField .

이것이 가능한가?



답변

재정의 -textRectForBounds:하면 자리 표시 자 텍스트의 삽입 만 변경됩니다. 편집 가능한 텍스트의 삽입을 변경하려면 재정의해야합니다.-editingRectForBounds:

// placeholder position
- (CGRect)textRectForBounds:(CGRect)bounds {
     return CGRectInset(bounds, 10, 10);
}

// text position
- (CGRect)editingRectForBounds:(CGRect)bounds {
     return CGRectInset(bounds, 10, 10);
}


답변

나는 그것을 통해 할 수 있었다 :

myTextField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);

물론 QuartzCore를 가져 와서 프로젝트에 프레임 워크를 추가해야합니다.


답변

왼쪽 여백이 필요하면 다음을 시도하십시오.

UItextField *textField = [[UITextField alloc] initWithFrame:...];
UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, textField.frame.size.height)];
leftView.backgroundColor = textField.backgroundColor;
textField.leftView = leftView;
textField.leftViewMode = UITextFieldViewModeAlways;

그것은 나를 위해 작동합니다. 이것이 도움이되기를 바랍니다.


답변

UITextField에서 파생 된 클래스에서이 두 가지 이상의 메서드를 재정의하십시오.

- (CGRect)textRectForBounds:(CGRect)bounds;
- (CGRect)editingRectForBounds:(CGRect)bounds;

추가 컨텐츠가없는 경우 다음과 같이 간단 할 수 있습니다.

return CGRectInset(bounds , 10, 10);

UITextField는 재정의 할 수있는 몇 가지 위치 지정 방법을 제공합니다.


답변

어떻게 약 @IBInspectable, @IBDesignable신속 클래스입니다.

@IBDesignable
class TextField: UITextField {
    @IBInspectable var insetX: CGFloat = 6 {
       didSet {
         layoutIfNeeded()
       }
    }
    @IBInspectable var insetY: CGFloat = 6 {
       didSet {
         layoutIfNeeded()
       }
    }

    // placeholder position
    override func textRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds , insetX , insetY)
    }

    // text position
    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds , insetX , insetY)
    }
}

스토리 보드에서 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

업데이트-스위프트 3

@IBDesignable
class TextField: UITextField {
    @IBInspectable var insetX: CGFloat = 0
    @IBInspectable var insetY: CGFloat = 0

    // placeholder position
    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: insetX, dy: insetY)
    }

    // text position
    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: insetX, dy: insetY)
    }
}


답변

명확한 버튼이 있으면 허용 된 답변이 효과가 없습니다. 우리는 또한 앞으로 전화하여 Apple이 변화하는 것을 막아야 super합니다.

따라서 텍스트가 지우기 버튼과 겹치지 않게하려면 super먼저 ‘기본’값을 가져온 다음 필요에 따라 조정 해 보겠습니다 .

이 코드는 텍스트 필드의 위쪽, 왼쪽 및 아래쪽에 10px 삽입을 추가합니다.

@interface InsetTextField : UITextField

@end


@implementation InsetTextField

// Placeholder position
- (CGRect)textRectForBounds:(CGRect)bounds {
    CGRect rect = [super textRectForBounds:bounds];
    UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, 10, 0);

    return UIEdgeInsetsInsetRect(rect, insets);
}

// Text position
- (CGRect)editingRectForBounds:(CGRect)bounds {
    CGRect rect = [super editingRectForBounds:bounds];
    UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, 10, 0);

    return UIEdgeInsetsInsetRect(rect, insets);
}

// Clear button position
- (CGRect)clearButtonRectForBounds:(CGRect)bounds {
    CGRect rect = [super clearButtonRectForBounds:bounds];

    return CGRectOffset(rect, -5, 0);
}

@end

참고 : UIEdgeInsetsMake는 top , left , bottom , right 순서로 매개 변수를 사용합니다 .


답변

스위프트 솔루션을 공급할 것이라고 생각했습니다.

import UIKit

class TextField: UITextField {
    let inset: CGFloat = 10

    // placeholder position
    override func textRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds , inset , inset)
    }

    // text position
    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds , inset , inset)
    }

    override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds, inset, inset)
    }
}

스위프트 3+

import UIKit

class TextField: UITextField {
    let inset: CGFloat = 10

    // placeholder position
    override func textRect(forBounds: CGRect) -> CGRect {
        return forBounds.insetBy(dx: self.inset , dy: self.inset)
    }

    // text position
    override func editingRect(forBounds: CGRect) -> CGRect {
        return forBounds.insetBy(dx: self.inset , dy: self.inset)
    }

    override func placeholderRect(forBounds: CGRect) -> CGRect {
        return forBounds.insetBy(dx: self.inset, dy: self.inset)
    }
}