Làm cách nào để tôi căn giữa văn bản UITextField theo chiều dọc?


143

Tôi chỉ đơn giản là bắt đầu một UITextFieldvà nhận thấy rằng văn bản không tập trung theo chiều dọc. Thay vào đó, nó được tuôn ra với đỉnh nút của tôi, điều mà tôi thấy hơi kỳ lạ vì tôi sẽ mong đợi mặc định sẽ căn giữa nó theo chiều dọc. Làm cách nào tôi có thể căn giữa nó theo chiều dọc hoặc có một số cài đặt mặc định mà tôi đang thiếu?

Câu trả lời:


369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

Trong sử dụng nhanh chóng:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center

1
@ user353877: Điều này vẫn hoạt động tốt. Lưu ý rằng trong phản hồi của Rogers, textFieldlà tên UITextFieldví dụ của anh ta - tên của bạn có thể khác. Vì vậy, anh ta sẽ có một cái gì đó như UITextField *textField = [[UITextField alloc] init];. Nếu bạn sử dụng một tên biến khác (bất cứ điều gì khác textFieldsau sau *), bạn cần phải làm yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenterthay thế.
GeneralMike

@ user353877 Thêm một dấu chấm ngay trước "Trung tâm": UIControlContentV verticalAlocate.Center;
Josh

1
Có phương pháp tương tự cho UITextView không?
CaffeineShots

Có một nhanh chóng tương đương cho tài sản này?
demofthemist

2
Trong Swift 3.0, đây là cách được đề xuất khi sử dụng enum:textField.contentVerticalAlignment = .center
Glenn

9

Điều này có khả năng có một số yếu tố phức tạp, một số được ám chỉ trong các câu trả lời trước:

  • Những gì bạn đang cố gắng căn chỉnh (chỉ số, chỉ chữ cái, chỉ chữ cái viết hoa hoặc hỗn hợp)
  • Giữ chỗ
  • Nút xóa

Những gì bạn đang cố gắng căn chỉnh là rất quan trọng vì điểm nào trong phông chữ phải được căn giữa theo chiều dọc do chiều cao dòng, độ cao, hậu duệ, v.v. (nguồn: ilovetypography.com ) (Hình ảnh nhờ http://ilovetypography.com/2009 / 01/14 / số liệu không rõ ràng theo chiều dọc / )
đặc điểm phông chữ dọc


Khi bạn đang xử lý chỉ các số chẳng hạn, căn chỉnh trung tâm tiêu chuẩn sẽ không hoàn toàn đúng. So sánh sự khác biệt trong hai bên dưới, sử dụng cùng một căn chỉnh (trong mã bên dưới), một trong số đó có vẻ chính xác và cái còn lại trông hơi khác:

Không hoàn toàn đúng với một hỗn hợp các chữ cái:

chữ cái không nhìn vào trung tâm

nhưng có vẻ đúng nếu nó chỉ là số

những con số nhìn vào trung tâm

Vì vậy, thật không may, nó có thể cần một chút thử nghiệm và lỗi và điều chỉnh thủ công để làm cho nó trông chính xác.

Tôi đã đặt đoạn mã dưới đây trong một lớp con của UITextField. Nó gọi các phương thức siêu lớp vì điều này sẽ tính đến nút xóa.

override func awakeFromNib() {
    contentVerticalAlignment = UIControlContentVerticalAlignment.Center
}

override func textRectForBounds(bounds: CGRect) -> CGRect {
    let boundsWithClear = super.textRectForBounds(bounds)
    let delta = CGFloat(1)
    return CGRect(x: boundsWithClear.minX, y: delta, width: boundsWithClear.width, height: boundsWithClear.height - delta/2)
}

override func editingRectForBounds(bounds: CGRect) -> CGRect {
    let boundsWithClear = super.editingRectForBounds(bounds)
    let delta = CGFloat(1)
    return CGRect(x: boundsWithClear.minX, y: delta, width: boundsWithClear.width, height: boundsWithClear.height - delta/2)
}

override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
    let delta = CGFloat(1)
    return CGRect(x: bounds.minX, y: delta, width: bounds.width, height: bounds.height - delta/2)
}

Tôi nghĩ rằng việc placeholderRectForBoundsmở rộng quá nhiều ở bên phải. Tôi có một quan điểm đúng đắn và nó đi sâu vào nó không giống như các giới hạn khác. Tôi vừa thực hiện textRectForBoundsvà gọi nó từ 2 func khác :)
Sasho

5

Trong bảng phân cảnh: Dưới sự kiểm soát -> thay đổi hướng dọc cũng như ngang, theo nhu cầu của bạn.

nhập mô tả hình ảnh ở đây


1

Điều này hoạt động tốt cho văn bản của textField. Nhưng nếu bạn muốn sử dụng văn bản giữ chỗ (một văn bản sẽ xuất hiện trong khi trường văn bản trống), trên iOS 7 bạn sẽ gặp phải sự cố.

Tôi đã giải quyết nó bằng cách ghi đè lớp TextField và

- (void) drawPlaceholderInRect:(CGRect)rect

phương pháp.

Như thế này:

- (void) drawPlaceholderInRect:(CGRect)rect
{
    [[UIColor blueColor] setFill];
    CGRect placeholderRect = CGRectMake(rect.origin.x, (rect.size.height- self.font.pointSize)/2, rect.size.width, self.font.pointSize);
    [[self placeholder] drawInRect:placeholderRect withFont:self.font lineBreakMode:NSLineBreakByWordWrapping alignment:self.textAlignment];
}

Hoạt động cho cả iOS7 và các phiên bản trước đó.


Làm thế nào để bạn xử lý điều đó trong Swift? Bởi vì self.placeholder.drawInRect không tồn tại trong Swift.
Vua-Pháp sư

điều này hoạt động, nhưng self.font.pointSize dường như hoạt động tốt hơn một chút so với pointSize
ED-209
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.