sourcetip

UITextBorderStyleNone을 사용하여 UITextField의 패딩을 설정합니다.

fileupload 2023. 4. 23. 11:02
반응형

UITextBorderStyleNone을 사용하여 UITextField의 패딩을 설정합니다.

커스텀 배경화면을 사용하고 싶어서UITextFields이 기능은 정상적으로 동작합니다.단, 사용해야 한다는 점만 제외하고UITextBorderStyleNone예쁘게 하려고요.이렇게 하면 텍스트가 패딩 없이 강제로 왼쪽으로 고정됩니다.

은 수동으로 할 수 할 수 ?UITextBorderStyleRoundedRect커스텀 배경 이미지를 사용하는 것 말고는요?

이 상황에 맞게 왼쪽 패딩을 세팅할 수 있는 깔끔한 작은 해킹을 찾았어요.

으로는 leftView의 leftView로 합니다.UITextField을 사용하다

UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
textField.leftView = paddingView;
textField.leftViewMode = UITextFieldViewModeAlways;

나한테는 마법처럼 작용했어!

Swift 3/Swift 4에서는 그렇게 할 수 있습니다.

let paddingView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 20))
textField.leftView = paddingView
textField.leftViewMode = .always

, 「이 카테고리의 실장」의 맨 했습니다..m

@implementation UITextField (custom)
    - (CGRect)textRectForBounds:(CGRect)bounds {
        return CGRectMake(bounds.origin.x + 10, bounds.origin.y + 8,
                          bounds.size.width - 20, bounds.size.height - 16);
    }
    - (CGRect)editingRectForBounds:(CGRect)bounds {
        return [self textRectForBounds:bounds];
    }
@end

표트르 블라시아크서브클래스를 보다 더 보였고, 더 것을 보다 더 간단해 보였어요.UIView그러나 텍스트 필드 내의 패딩을 제어할 수 없는 것은 뭔가 부족한 것 같습니다.

Swift 4 솔루션:

class CustomTextField: UITextField {
    struct Constants {
        static let sidePadding: CGFloat = 10
        static let topPadding: CGFloat = 8
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(
            x: bounds.origin.x + Constants.sidePadding,
            y: bounds.origin.y + Constants.topPadding,
            width: bounds.size.width - Constants.sidePadding * 2,
            height: bounds.size.height - Constants.topPadding * 2
        )
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return self.textRect(forBounds: bounds)
    }
}

Xcode > 6 용 Swift 3 버전.Interface Builder / Storyboard에서 inset 값을 편집할 수 있습니다.

import UIKit

@IBDesignable
class FormTextField: UITextField {

    @IBInspectable var inset: CGFloat = 0

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

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return textRect(forBounds: bounds)
    }

}

여기에 이미지 설명 입력

편집: iOS 11.3.1에서도 동작합니다.

6의 경우 iOS 6의 경우myTextField.leftView = paddingView;의 원인입니다.

이것으로 문제가 해결된다.

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

는, 「 」를 사용합니다.CATransform3DMakeTranslation(-5, 0, 0)라테나이트코더가 코멘트에서 언급했듯이

UITextField에 패딩을 추가하는 좋은 방법은 edgeInsets 속성을 서브클래스하여 추가하는 것입니다.그런 다음 edgeInsets를 설정하면 그에 따라 UETextField가 그려집니다.커스텀 leftView 또는 rightView세트에서도 정상적으로 동작합니다.

OSTextField.h

#import <UIKit/UIKit.h>

@interface OSTextField : UITextField

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end

OSTextField.m

#import "OSTextField.h"

@implementation OSTextField

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.edgeInsets = UIEdgeInsetsZero;
    }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if(self){
        self.edgeInsets = UIEdgeInsetsZero;
    }
    return self;
}

- (CGRect)textRectForBounds:(CGRect)bounds {
    return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [super editingRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

@end

UITextField의 서브클래스는 다음과 같습니다.

@implementation DFTextField


- (CGRect)textRectForBounds:(CGRect)bounds
{
    return CGRectInset(bounds, 10.0f, 0);
}

- (CGRect)editingRectForBounds:(CGRect)bounds
{
    return [self textRectForBounds:bounds];
}


@end

이렇게 하면 양쪽에 10점의 수평 패딩이 추가됩니다.

  1. 텍스트 필드 사용자 정의 만들기

PaddingTextField.swift

import UIKit
class PaddingTextField: UITextField {

@IBInspectable var paddingLeft: CGFloat = 0
@IBInspectable var paddingRight: CGFloat = 0

override func textRectForBounds(bounds: CGRect) -> CGRect {
    return CGRectMake(bounds.origin.x + paddingLeft, bounds.origin.y,
        bounds.size.width - paddingLeft - paddingRight, bounds.size.height);
}

override func editingRectForBounds(bounds: CGRect) -> CGRect {
    return textRectForBounds(bounds)
}}
  1. 텍스트 필드 클래스를 PaddingTextField로 설정하고 필요에 따라 패딩을 커스터마이즈합니다.

  2. 그것을 즐기세요.

최종

목표 C 코드

MyTextField.h

#import <UIKit/UIKit.h>

@interface MyTextField : UITextField

@property (nonatomic) IBInspectable CGFloat padding;

@end

MyTextField.m

#import "MyTextField.h"

IB_DESIGNABLE
@implementation MyTextField

@synthesize padding;

-(CGRect)textRectForBounds:(CGRect)bounds{
    return CGRectInset(bounds, padding, padding);
}

-(CGRect)editingRectForBounds:(CGRect)bounds{
    return [self textRectForBounds:bounds];
}

@end

여기에 이미지 설명 입력

Evil Traut의 답변을 바탕으로 여러 응용 프로그램에서 사용하기 쉽게 범주를 만들 수 있습니다.

헤더 파일:

@interface UITextField (PaddingText)

-(void) setLeftPadding:(int) paddingValue;

-(void) setRightPadding:(int) paddingValue;
@end

구현 파일:

#import "UITextField+PaddingText.h"

@implementation UITextField (PaddingText)

-(void) setLeftPadding:(int) paddingValue
{
    UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, paddingValue, self.frame.size.height)];
    self.leftView = paddingView;
    self.leftViewMode = UITextFieldViewModeAlways;
}

-(void) setRightPadding:(int) paddingValue
{
    UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, paddingValue, self.frame.size.height)];
    self.rightView = paddingView;
    self.rightViewMode = UITextFieldViewModeAlways;
}

@end

사용 예

#import "UITextField+PaddingText.h"

[self.YourTextField setLeftPadding:20.0f];

도움이 됐으면 좋겠다

건배.

Swift 버전:

extension UITextField {
    @IBInspectable var padding_left: CGFloat {
        get {
            LF.log("WARNING no getter for UITextField.padding_left")
            return 0
        }
        set (f) {
            layer.sublayerTransform = CATransform3DMakeTranslation(f, 0, 0)
        }
    }
}

IB에서 가치를 할당할 수 있도록

Interface Builder에 표시되는 IBInspectable 설정

패딩을 설정할 수 없습니다. ㅇㅇㅇ가 요.UIView와 '배경 이미지'가 .UITextFieldinside .UITextField은 서 width폭 width width width width width width width width width.UIViewWidth-(paddingSize x 2) 높이를 .paddingSize,paddingSize.

UITextField 하위 클래스(Swift 버전):

import UIKit

class CustomTextField: UITextField {

    override func textRectForBounds(bounds: CGRect) -> CGRect {
       return CGRectInset(bounds, 25.0, 0)
    }

    override func editingRectForBounds(bounds: CGRect) -> CGRect {
       return self.textRectForBounds(bounds)
    }

}

이렇게 하면 양쪽에 25.0점의 수평 패딩이 추가됩니다.

저는 Nate의 솔루션을 기반으로 하고 있었습니다만, 그 결과, 왼쪽 뷰/오른쪽 뷰 속성을 사용할 때 문제가 발생하므로, 왼쪽/오른쪽 뷰가 고려되기 때문에 슈퍼의 구현을 보다 잘 조정할 수 있습니다.

- (CGRect)textRectForBounds:(CGRect)bounds {
    CGRect ret = [super textRectForBounds:bounds];
    ret.origin.x = ret.origin.x + 5;
    ret.size.width = ret.size.width - 10;
    return ret;
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [self textRectForBounds:bounds];
}

Swift 3 업데이트 버전:

@IBDesignable
class FormTextField: UITextField {

    @IBInspectable var paddingLeft: CGFloat = 0
    @IBInspectable var paddingRight: CGFloat = 0

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect(x: bounds.origin.x + paddingLeft, y: bounds.origin.y, width: bounds.size.width - paddingLeft - paddingRight, height: bounds.size.height)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return textRect(forBounds: bounds)
    }
}

UITextBorderStyleNone을 사용하여 UITextField 패딩을 설정합니다.재빠르다

@Evil Traut의 가장 많은 표를 얻은 답변을 바탕으로 아래 그림과 같이 View Controller 클래스에서 커스텀 메서드를 만들었습니다.

- (void) modifyTextField:(UITextField *)textField
{
    UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
    textField.leftView = paddingView;
    textField.leftViewMode = UITextFieldViewModeAlways;
    textField.rightView = paddingView;
    textField.rightViewMode = UITextFieldViewModeAlways;

    [textField setBackgroundColor:[UIColor whiteColor]];
    [textField setTextColor:[UIColor blackColor]];
}

이제 이 메서드를 내부(viewDidLoad 메서드)로 호출하여 임의의 TextFields를 해당 메서드로 전송하고 오른쪽과 왼쪽 모두에 패딩을 추가할 수 있습니다.또, 다음과 같이 코드의 1 행만 기입하면, 텍스트와 배경색을 지정할 수 있습니다.

[self modifyTextField:self.firstNameTxtFld];

iOS 7에서 완벽하게 작동했습니다! 보기를 너무 많이 추가하면 로드하기에 다소 무거운 클래스가 될 수 있습니다.하지만 다른 해결책의 어려움에 대해 우려할 때, 저는 이 방법에 더 치우쳐 있고 이 방법을 사용하는 데 더 유연하다는 것을 알게 되었습니다.;)

'악마의 송어' 해킹 감사합니다!

이 답변의 코드 스니펫을 Swift로 업데이트해야겠다고 생각했습니다.

Swift에서는 기존 클래스의 확장자를 쓸 수 있기 때문에 그렇게 쓰도록 합시다.

extension UITextField {
    func addPaddingToTextField() {
        let paddingView: UIView = UIView.init(frame: CGRectMake(0, 0, 8, 20))
        self.leftView = paddingView;
        self.leftViewMode = .Always;
        self.rightView = paddingView;
        self.rightViewMode = .Always;

    
        self.backgroundColor = UIColor.whiteColor()
        self.textColor = UIColor.blackColor()
    }
}

사용방법:

self.firstNameTxtFld.addPaddingToTextField()

이게 다른 사람에게 도움이 되었으면 좋겠네요!
건!!

SWIFT에서 이를 실현하는 방법은 다음과 같습니다.

@IBOutlet weak var yourTextField: UITextField!

override func viewDidLoad() {
super.viewDidLoad()
let paddingView = UIView(frame: CGRectMake(0, 0, 10, self.yourTextField.frame.height))
yourTextField.leftView = paddingView
yourTextField.leftViewMode = UITextFieldViewMode.Always
}
}

자원

Swift 2.0 버전:

let paddingView: UIView = UIView(frame: CGRectMake(0, 0, 5, 20))
textField.leftView = paddingView
textField.leftViewMode = UITextFieldViewMode.Always;

사람이 Swift 4.0 그 후 " " "extension일요 it. 둘 both both both both .Left ★★★★★★★★★★★★★★★★★」Right.UITextField은 사렇그그 . . . . . . . . ..IBInspectable참の참인터페이스 빌더 / 스토리보드 4.0 9.0에서입니다.

「 」를 유효하게 는, .Clear Button 처지에UITextField오른쪽 패딩을 공백으로 유지해야 합니다.

import UIKit

extension UITextField {

    @IBInspectable var paddingLeft: CGFloat {
        get {
            return leftView!.frame.size.width
        }
        set {
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
            leftView = paddingView
            leftViewMode = .always
        }
    }

    @IBInspectable var paddingRight: CGFloat {
        get {
            return rightView!.frame.size.width
        }
        set {
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
            rightView = paddingView
            rightViewMode = .always     
        }
    }
}  

^ 이러한 제안은 프로그래밍 방식으로 인터페이스를 작성하는 사용자에게 매우 적합합니다.

그러나 Xcode 인터페이스 빌더를 사용하는 사용자에게는 두 가지 LAGY EASY WAYS가 있습니다.

  • 간단: 텍스트 필드 뒤에 UIImageView 배치

  • 가장 쉬운 방법: 의 테두리 스타일을 단순한 검은색 정사각형(왼쪽 옵션에서 두 번째)으로 변경한 다음 이미지를 배경 이미지로 추가합니다.이미지가 정사각형보다 우선하므로 정사각형이 실제로 그려지지 않고 일반 이미지 배경에 필요한 패딩을 얻을 수 있습니다.

편집: 검은색 구(IB에서 UITextBox를 선택할 때 왼쪽 옵션에서 세 번째)를 사용할 수도 있습니다. 맨 오른쪽의 "그래픽 구" 스타일에서는 사용할 수 없습니다.

가장 좋은 방법은 UITextField의 서브클래스와 .m 파일을 사용하여 클래스를 만드는 것입니다.

 #import "CustomTextField.h"
 #import <QuartzCore/QuartzCore.h>
 @implementation CustomTextField


- (id)initWithCoder:(NSCoder*)coder 
 {
  self = [super initWithCoder:coder];

  if (self) {

//self.clipsToBounds = YES;
//[self setRightViewMode:UITextFieldViewModeUnlessEditing];

self.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,15,46)];
self.leftViewMode=UITextFieldViewModeAlways;
   }

  return self;

 }

이를 통해 스토리보드 또는 xib로 이동하여 ID 검사기를 클릭하고 UITextfield를 사용자 정의로 바꿉니다.[ TextField ]를 선택합니다.

주의: 텍스트 필드의 자동 레이아웃으로 패딩을 제공하는 경우 응용 프로그램은 실행되지 않고 빈 화면만 표시됩니다.

Swift 3 버전:

class CustomTextField:UITextField{

    required init?(coder aDecoder: NSCoder){
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return CGRect.init(x: bounds.origin.x + 8, y: bounds.origin.y, width: bounds.width, height: bounds.height)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return self.textRect(forBounds:bounds)
    }
}

네이트 플링크의 답변은 내가 가장 좋아하는 것이지만, 오른쪽/왼쪽 뷰를 잊지 마세요.예:UITextField서브클래스:

override func rightViewRectForBounds(bounds: CGRect) -> CGRect {
    let rightViewBounds = super.rightViewRectForBounds(bounds)

    return CGRectMake(CGRectGetMinX(rightViewBounds) - 10, CGRectGetMinY(rightViewBounds), CGRectGetWidth(rightViewBounds), CGRectGetHeight(rightViewBounds))
}

위의 코드 세트 오른쪽 패딩rightViewUITextField.

Swift 3 솔루션

class CustomTextField: UITextField {

 override func textRect(forBounds bounds: CGRect) -> CGRect {
  return CGRect(x: bounds.origin.x + 10, y: bounds.origin.y + 8, width: bounds.size.width - 20, height: bounds.size.height - 16)
 }

 override func editingRect(forBounds bounds: CGRect) -> CGRect {
  return self.textRect(forBounds: bounds)
 }
}

UITextfield에서 패딩을 제공하는 Swift 코드입니다.

 func txtPaddingVw(txt:UITextField) {
     let paddingView = UIView(frame: CGRectMake(0, 0, 10, 10))
     txt.leftViewMode = .Always
     txt.leftView = paddingView
 }

및 를 사용하여 호출합니다.

self.txtPaddingVw(txtPin)

카테고리를 사용할 수 있습니다. 패딩을 왼쪽과 오른쪽으로 설정합니다.

UITextField+Padding.h

@interface UITextField (Padding)
@property (nonatomic, assign) CGFloat paddingValue;
@property (nonatomic, assign) CGFloat leftPadding;
@property (nonatomic, assign) CGFloat rightPadding;

//overwrite
-(CGRect)textRectForBounds:(CGRect)bounds;
-(CGRect)editingRectForBounds:(CGRect)bounds;
@end

UITextField+Padding.m

#import "UITextField+Padding.h"
#import <objc/runtime.h>

static char TAG_LeftPaddingKey;
static char TAG_RightPaddingKey;
static char TAG_Left_RightPaddingKey;

@implementation UITextField (Padding)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
-(CGRect)textRectForBounds:(CGRect)bounds {

CGFloat offset_Left=0;
CGFloat offset_Right=0;
if (self.paddingValue>0) {
    offset_Left=self.paddingValue;
    offset_Right=offset_Left;
}else{
    if (self.leftPadding>0){
        offset_Left=self.leftPadding;
    }
    if (self.rightPadding>0){
        offset_Right=self.rightPadding;
    }
}

if (offset_Left>0||offset_Right>0) {
    return CGRectMake(bounds.origin.x+ offset_Left ,bounds.origin.y ,
                      bounds.size.width- (offset_Left+offset_Right), bounds.size.height-2 );
 }else{
    return bounds;
 }
}



-(CGRect)editingRectForBounds:(CGRect)bounds {
    return [self textRectForBounds:bounds];
}
#pragma clang diagnostic pop


#pragma maek -setter&&getter
- (CGFloat)paddingValue
{
    return [objc_getAssociatedObject(self,&TAG_Left_RightPaddingKey) floatValue];
}
-(void)setPaddingValue:(CGFloat)paddingValue
{
    objc_setAssociatedObject(self, &TAG_Left_RightPaddingKey, @(paddingValue), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(CGFloat)leftPadding
{
    return [objc_getAssociatedObject(self,&TAG_LeftPaddingKey) floatValue];
}

-(void)setLeftPadding:(CGFloat)leftPadding
{
    objc_setAssociatedObject(self, &TAG_LeftPaddingKey, @(leftPadding), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(CGFloat)rightPadding
{
    return [objc_getAssociatedObject(self,&TAG_RightPaddingKey) floatValue];
}

-(void)setRightPadding:(CGFloat)rightPadding
{
    objc_setAssociatedObject(self, &TAG_RightPaddingKey, @(rightPadding), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

이렇게 패딩을 설정할 수 있습니다.phoneNumTF.paddingValue=10.f; 또는 self.phoneNumTF.leftPadding=10.f;

@악마의 대답은 훌륭하다.나는 꽤 오랫동안 이 방법을 사용해 왔다.유일하게 부족한 것은 "다양한 텍스트 필드 처리"입니다.다른 방법을 시도했지만 효과가 없는 것 같습니다.

패딩을 추가하기 위해 UITextField를 하위 분류하는 것은 의미가 없었습니다.그래서 모든 UITextFields에서 반복하여 패딩을 추가했습니다.

-(void) addPaddingToAllTextFields:(UIView*)view {

    for(id currentView in [view subviews]){
        if([currentView isKindOfClass:[UITextField class]]) {
            // Change value of CGRectMake to fit ur need
            [currentView setLeftView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 20)]];
            [currentView setLeftViewMode:UITextFieldViewModeAlways];
        }

        if([currentView respondsToSelector:@selector(subviews)]){
            [textfieldarray addObjectsFromArray:[self addPaddingToAllTextFields:currentView]];
        }
    }
}

브로디의 솔루션은 나에게 완벽했다.텍스트 필드에 측면 뷰를 추가하고 추가 패딩을 추가해야 했습니다.따라서 커스텀 UIEdgeInset 속성을 UITextField 서브클래스에 구현함으로써 작업을 수행할 수 있었습니다.이 새로운 서브클래스를 모든 프로젝트에 사용할 예정입니다.

지금까지 제가 찾은 최고의 해결책은 범주입니다.이렇게 하면 좌우에 5점 패딩을 추가할 수 있습니다.

@implementation UITextField (Padding)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (CGRect)textRectForBounds:(CGRect)bounds {
    return CGRectMake(bounds.origin.x + 5, bounds.origin.y,
                      bounds.size.width - 10, bounds.size.height);
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [self textRectForBounds:bounds];
}
#pragma clang diagnostic pop

@end

#pragma는 귀찮은 경고를 없애기 위한 것입니다.

textField.layer.borderWidth = 3;

테두리를 더해주실 거예요.그게 제 패딩이었어요.

는 편집 불가능한 것을 더 쉽다는 을 알았다.UITextView 해서 해 주세요.contentOffset

uiTextView.contentOffset = CGPointMake(8, 7);

언급URL : https://stackoverflow.com/questions/3727068/set-padding-for-uitextfield-with-uitextborderstylenone

반응형