Поле UITextField leftView/rightView обивка на iOS7


представления leftView и rightView UITextField на iOS7 действительно близки к границе текстового поля.

Как я могу добавить некоторые (горизонтальные) отступы к этим элементам?

Я попытался изменить кадр, но не работает

uint padding = 10;//padding for iOS7
UIImageView * iconImageView = [[UIImageView alloc] initWithImage:iconImage];    
iconImageView.frame = CGRectMake(0 + padding, 0, 16, 16);
textField.leftView = iconImageView;

Пожалуйста, обратите внимание, что я не заинтересован в добавление отступов к тексту текстового поля, как это установить заполнение для UITextField с UITextBorderStyleNone

6 77

6 ответов:

просто работал над этим сам и использовал это решение:

- (CGRect) rightViewRectForBounds:(CGRect)bounds {

    CGRect textRect = [super rightViewRectForBounds:bounds];
    textRect.origin.x -= 10;
    return textRect;
}

это переместит изображение справа на 10 вместо того, чтобы изображение сжималось до края в iOS 7.

кроме того, это было в подклассе UITextField, который может быть создан с помощью:

  1. создать новый файл, который является подклассом UITextField вместо NSObject
  2. Добавить новый метод, названный - (id)initWithCoder:(NSCoder*)coder установить изображение

    - (id)initWithCoder:(NSCoder*)coder {
        self = [super initWithCoder:coder];
    
        if (self) {
    
            self.clipsToBounds = YES;
            [self setRightViewMode:UITextFieldViewModeUnlessEditing];
    
            self.leftView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"textfield_edit_icon.png"]];
        }
    
        return self;
    }
    
  3. возможно, вам придется импортировать #import <QuartzCore/QuartzCore.h>

  4. добавить rightViewRectForBounds метод

  5. в Interface Builder, нажмите на текстовое поле, которое вы хотели бы подкласс и изменить атрибут класса на имя этого нового подкласса

гораздо более простое решение, которое использует contentMode:

    arrow = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"down_arrow"]];
    arrow.frame = CGRectMake(0.0, 0.0, arrow.image.size.width+10.0, arrow.image.size.height);
    arrow.contentMode = UIViewContentModeCenter;

    textField.rightView = arrow;
    textField.rightViewMode = UITextFieldViewModeAlways;

В Swift 2,

    let arrow = UIImageView(image: UIImage(named: "down_arrow"))
    arrow.frame = CGRectMake(0.0, 0.0, arrow.image.size.width+10.0, arrow.image.size.height);
    arrow.contentMode = UIViewContentMode.Center
    self.textField.rightView = arrow
    self.textField.rightViewMode = UITextFieldViewMode.Always

В Swift 3,

    let arrow = UIImageView(image: UIImage(named: "arrowDrop"))
    if let size = arrow.image?.size {
        arrow.frame = CGRect(x: 0.0, y: 0.0, width: size.width + 10.0, height: size.height)
    }
    arrow.contentMode = UIViewContentMode.center
    self.textField.rightView = arrow
    self.textField.rightViewMode = UITextFieldViewMode.always

самый простой способ-добавить UIView в leftView / rightview и добавить ImageView в UIView , настроить происхождение ImageView внутри UIView в любом месте , где вам нравится, это сработало для меня как шарм. Для этого нужно всего несколько строк кода

UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 5, 26, 26)];
imgView.image = [UIImage imageNamed:@"img.png"];

UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];
[paddingView addSubview:imgView];
[txtField setLeftViewMode:UITextFieldViewModeAlways];
[txtField setLeftView:paddingView];

это отлично работает для Swift:

let imageView = UIImageView(image: UIImage(named: "image.png"))
imageView.contentMode = UIViewContentMode.Center
imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 20.0, imageView.image!.size.height)
textField.rightViewMode = UITextFieldViewMode.Always
textField.rightView = imageView

это работает для меня

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

может это поможет вам.

Мне нравится это решение, потому что оно решает проблему с одной строкой кода

myTextField.layer.sublayerTransform = CATransform3DMakeTranslation(10.0f, 0.0f, 0.0f);

Примечание: .. или 2, Если вы рассматриваете возможность включения QuartzCore в строку :)