나는 삽입 된하고자하는 텍스트 의를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)
}
}