2014-07-15 26 views
5

Tôi gặp một số sự cố với inputView tùy chỉnh của mình cho UITextFields. Tùy thuộc vào văn bản mà người dùng cần nhập vào trong một UITextField, inputView chỉ hiển thị các chữ cái cần thiết. Điều đó có nghĩa là đối với văn bản ngắn, một inputView với chỉ một dòng chữ là đủ, văn bản dài hơn có thể yêu cầu 2 hoặc thậm chí 3 dòng để chiều cao của inputView là variabel.Tùy chỉnh inputView với chiều cao động trong iOS 8

Vì tôi đã mong đợi hiệu suất tốt hơn, nên chỉ tồn tại một cá thể inputView được sử dụng bởi mọi trường văn bản. Bằng cách đó, việc tạo ra chỉ phải xảy ra một lần và nó làm cho đôi khi cần truy cập trực tiếp vào inputView dễ dàng hơn. InputView được thiết lập trong - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField, đặt chiều cao yêu cầu của nó và sẽ được hiển thị.

Điều đó hoạt động hoàn hảo, nhưng không hoạt động trên iOS8. Có một số khung nhìn hệ thống chứa inputView sẽ không cập nhật khung của nó để phù hợp với giới hạn của inputView khi chúng được thay đổi (lần đầu tiên hoạt động).

Tôi biết rằng có thể được khắc phục bằng cách sử dụng một phiên bản inputView của tôi cho mỗi textField. Nhưng tôi hỏi nếu có một cách tốt hơn được đề xuất để điều chỉnh khung hoặc báo cáo thay đổi của nó cho chế độ xem có chứa. Có thể đó là lỗi iOS8 có thể được khắc phục cho đến khi phát hành?

Dưới đây là một số mã ví dụ để tạo lại vấn đề:

CustomInputView

@implementation CustomInputView 

+ (CustomInputView*)sharedInputView{ 
    static CustomInputView *sharedInstance; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[CustomInputView alloc] init]; 
    }); 
    return sharedInstance; 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     self.backgroundColor = [UIColor greenColor]; 
    } 
    return self; 
} 

- (void)setupForTextField:(UITextField*)textField{ 
    CGFloat height; 

    if(textField.tag == 1){ 
     height = 100; 
    }else height = 50; 

    self.frame = CGRectMake(0, 0, 320, height); 
} 
@end 

TestViewController đang

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(15, 50, 290, 30)]; 
    tf.text = @"bigKeyboard"; 
    tf.inputView = [CustomInputView sharedInputView]; 
    tf.layer.borderWidth = 1; 
    tf.layer.borderColor = [UIColor lightGrayColor].CGColor; 
    tf.delegate = self; 
    tf.tag = 1; 
    [self.view addSubview:tf]; 

    tf = [[UITextField alloc] initWithFrame:CGRectMake(15, 100, 290, 30)]; 
    tf.text = @"smallKeyboard"; 
    tf.inputView = [CustomInputView sharedInputView]; 
    tf.layer.borderWidth = 1; 
    tf.layer.borderColor = [UIColor lightGrayColor].CGColor; 
    tf.delegate = self; 
    tf.tag = 2; 
    [self.view addSubview:tf]; 

    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; 
    [button setTitle:@"dismissKeyboard" forState:UIControlStateNormal]; 
    [button addTarget:self action:@selector(endEditing) forControlEvents:UIControlEventTouchUpInside]; 
    button.frame = CGRectMake(15, 150, 290, 30); 
    [self.view addSubview:button]; 
} 

- (void)endEditing{ 
    [self.view endEditing:YES]; 
} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ 
    [[CustomInputView sharedInputView] setupForTextField:textField]; 
    return YES; 
} 
+0

Bạn đã tìm thấy giải pháp nào để đổi kích thước inputView chưa? Tôi cần chiều cao inputView cố định cho iPad. –

+0

Nếu bạn cần chiều cao cố định, nó sẽ hoạt động - inputView sẽ ở lại độ cao bạn chỉ định khi bạn tạo nó. Nếu bạn cần phải thay đổi chiều cao sau này, tôi vẫn không nhận thức được một giải pháp. Tôi đã workaround của việc tạo ra một inputView cho mỗi textField đó là ok cho trường hợp của tôi ... – robert

Trả lời

12

Tôi có vấn đề tương tự với kích thước bàn phím tùy chỉnh từ iOS 8 lên iOS 10. Tôi tin rằng các giải pháp thích hợp là để có cái nhìn đầu vào cung cấp một thích hợp intrinsicContentSize và thay đổi (và invalidate!) Giá trị đó khi bạn muốn thay đổi t chiều cao của anh ta xem. Mã mẫu:

class CustomInputView: UIInputView { 
    var intrinsicHeight: CGFloat = 200 { 
     didSet { 
      self.invalidateIntrinsicContentSize() 
     } 
    } 

    init() { 
     super.init(frame: CGRect(), inputViewStyle: .keyboard) 
     self.translatesAutoresizingMaskIntoConstraints = false 
    } 

    required init?(coder: NSCoder) { 
     super.init(coder: coder) 
     self.translatesAutoresizingMaskIntoConstraints = false 
    } 

    override var intrinsicContentSize: CGSize { 
     return CGSize(width: UIViewNoIntrinsicMetric, height: self.intrinsicHeight) 
    } 
} 

class ViewController: UIViewController { 
    @IBOutlet weak var textView: UITextView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     textView.becomeFirstResponder() 

     let inputView = CustomInputView() 
     // To make the view's size more clear. 
     inputView.backgroundColor = UIColor(red: 0.5, green: 1, blue: 0.5, alpha: 1) 
     textView.inputView = inputView 

     // To demonstrate a change to the view's intrinsic height. 
     DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(2)) { 
      inputView.intrinsicHeight = 400 
     } 
    } 
} 

Xem thêm https://stackoverflow.com/a/40359382/153354.

Các vấn đề liên quan