[ios] UITextBorderStyleNone으로 UITextField의 패딩 설정

에 대한 사용자 지정 배경을 사용하고 싶었습니다 UITextFields. UITextBorderStyleNone예쁘게 보이기 위해 사용해야한다는 것을 제외하고는 잘 작동합니다 . 이것은 패딩없이 텍스트를 왼쪽에 붙입니다.

UITextBorderStyleRoundedRect사용자 정의 배경 이미지를 사용 하는 것을 제외하고 패딩을 수동으로 설정할 수 있습니까 ?



답변

이 정확한 상황을 위해 왼쪽 패딩을 설정하는 깔끔한 작은 핵을 발견했습니다.

기본적으로의 leftView 속성 UITextField을 원하는 패딩 크기의 빈 뷰로 설정합니다 .

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

나를 위해 매력처럼 일했다!

에서 스위프트 3 / 스위프트 네 , 그것은 그 일을 수행 할 수 있습니다

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

Piotr Blasiak이 제공 한 링크를 기반으로합니다. 완전히 새로운 서브 클래스를 작성하는 것이 더 단순 해 보이고 추가를 추가하는 것이 더 단순 해 보였습니다 UIView. 여전히 텍스트 필드 내부의 패딩을 제어 할 수없는 것이없는 것 같습니다.

스위프트 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)
    }
}


답변

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

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에서 작동

iOS 6에서 myTextField.leftView = paddingView;문제가 발생합니다

이것은 문제를 해결

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

latenitecoder 가 주석에서 CATransform3DMakeTranslation(-5, 0, 0)언급 한대로 올바르게 정렬 된 텍스트 필드 사용


답변

UITextField에 패딩을 추가하는 좋은 방법은 edgeInsets 속성을 서브 클래 싱하고 추가하는 것입니다. 그런 다음 edgeInsets를 설정하면 UITextField가 그에 따라 그려집니다. 사용자 정의 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 포인트의 수평 패딩을 추가합니다.


답변

목표 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

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