Pertanyaan UITextfield meninggalkan slideView / rightView di iOS7


Tampilan leftView dan rightView dari UITextField di iOS7 benar-benar dekat dengan batas textfield.

Bagaimana saya bisa menambahkan beberapa padding (horizontal) ke barang-barang itu?

Saya mencoba memodifikasi frame, tetapi tidak berhasil

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

Tolong, perhatikan bahwa saya tidak tertarik menambahkan padding ke teks textfield, seperti ini Atur padding untuk UITextField dengan UITextBorderStyleNone


75
2017-10-14 23:39


asal


Jawaban:


Sedang mengerjakan ini sendiri dan menggunakan solusi ini:

- (CGRect) rightViewRectForBounds:(CGRect)bounds {

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

Ini akan memindahkan gambar dari kanan ke kanan 10 alih-alih membuat gambar terhempas ke tepi di iOS 7.

Selain itu, ini adalah subkelas dari UITextField, yang dapat dibuat oleh:

  1. Buat file baru yang merupakan subkelas dari UITextField bukan default NSObject
  2. Tambahkan metode baru bernama - (id)initWithCoder:(NSCoder*)coder untuk mengatur gambar

    - (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. Anda mungkin harus mengimpor #import <QuartzCore/QuartzCore.h>

  4. Tambahkan rightViewRectForBounds metode di atas

  5. Di Interface Builder, klik TextField yang Anda inginkan untuk subclass dan ubah atribut class ke nama subkelas baru ini


69
2017-10-15 04:10



Solusi yang jauh lebih sederhana, yang memanfaatkan 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;

Di 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

Di 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

142
2018-06-24 13:53



Cara termudah adalah menambahkan UIView ke leftView / righView dan menambahkan ImageView ke UIView, sesuaikan asal ImageView di dalam UIView di mana pun Anda suka, ini bekerja untuk saya seperti pesona. Hanya perlu beberapa baris kode

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];

38
2018-06-27 11:48



Ini sangat cocok untuk 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

11
2017-07-31 17:08



Ini bekerja untuk saya

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

Semoga ini membantu Anda.


6
2017-08-01 04:57



Saya suka solusi ini karena menyelesaikan masalah dengan satu baris kode

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

Catatan: .. atau 2 jika Anda mempertimbangkan termasuk QuartzCore a line :)


4
2017-12-24 11:01



Cara terbaik untuk melakukan ini adalah membuat kelas menggunakan subkelas dari UITextField dan file .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;

}

dengan melakukan ini, pergi ke storyboard atau xib Anda dan klik inspektur identitas dan ganti UITextfield dengan "CustomTextField" Anda sendiri dalam opsi kelas.

Catatan: Jika Anda hanya memberikan padding dengan tata letak otomatis untuk textfield maka aplikasi Anda tidak akan berjalan dan hanya menampilkan layar kosong.


3
2018-03-19 08:26



Saya menemukan ini di suatu tempat ...

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

[self addSubview:itemDescription];

1
2017-10-14 23:45



Buat kelas UITextField khusus dan gunakan kelas itu sebagai ganti UITextField. Override - (CGRect) textRectForBounds: (CGRect) bounds untuk mengatur rect yang Anda butuhkan

Contoh

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

1
2017-10-15 00:23



Saya memiliki masalah ini sendiri, dan sejauh ini solusi termudah adalah untuk mengubah gambar Anda untuk hanya menambahkan padding ke setiap sisi gambar!

Saya baru saja mengubah gambar png saya untuk menambahkan padding transparan 10 piksel, dan itu bekerja dengan baik, tanpa coding sama sekali!


1
2017-08-13 21:11



Satu trik: Tambahkan UIView berisi UIImageView ke UITextField sebagai rightView. Ukuran UIView ini harus lebih besar, sekarang tempatkan UIImageView ke kiri. Jadi akan ada padangan ruang dari kanan.

// Add a UIImageView to UIView and now this UIView to UITextField - txtFieldDate
UIView *viewRightIntxtFieldDate = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 30)]; 
// (Height of UITextField is 30px so height of viewRightIntxtFieldDate = 30px)
UIImageView *imgViewCalendar = [[UIImageView alloc] initWithFrame:CGRectMake(0, 10, 10, 10)];
[imgViewCalendar setImage:[UIImage imageNamed:@"calendar_icon.png"]];
[viewRightIntxtFieldDate addSubview:imgViewCalendar];
txtFieldDate.rightViewMode = UITextFieldViewModeAlways;
txtFieldDate.rightView = viewRightIntxtFieldDate;

0
2018-01-14 11:38