Làm thế nào để tạo một UITextfield đa dòng?


259

Tôi đang phát triển một ứng dụng mà người dùng phải viết một số thông tin. Đối với mục đích này, tôi cần một UITextFielddòng là đa dòng (nói chung UITextFieldlà một dòng).

Khi tôi đang tìm kiếm, tôi tìm thấy câu trả lời cho việc sử dụng UITextViewthay vì UITextfieldcho mục đích này.


Đây là điều khiển nhỏ tôi đã viết chính xác cho mục đích đó. Nó có hỗ trợ đa dòng và nút Xong để đóng bàn phím. vui lòng sử dụng nó code.google.com/p/galtextfield
Gal Blank

2
sử dụng các lớp bên thứ ba này nhập dự án xcode của bạn và sử dụng nó, liên kết hoạt động quá tốt: github.com/adonoho/HPGrowingTextView
mahesh chowdary 27/11/13

Câu trả lời:


435

UITextField chỉ cụ thể một dòng.

Tìm kiếm Google của bạn là chính xác, bạn cần sử dụng UITextViewthay vì UITextFieldhiển thị và chỉnh sửa văn bản nhiều dòng.

Trong Trình tạo giao diện, thêm một UITextViewnơi bạn muốn và chọn hộp "có thể chỉnh sửa". Nó sẽ là multiline theo mặc định.


7
Vì vậy, hãy cho tôi biết cách ứng dụng Lịch gốc tạo Chế độ xem với trình giữ chỗ và gói từ để ghi chú tại màn hình thêm sự kiện?
Gennadiy Ryabkin

3
Làm cách nào để đặt giữ chỗ cho UITextView?
Mani

4
Bạn không thể thêm trình giữ chỗ vào TextView, nhưng bạn có thể thêm nhãn màu xám trên TextView và ẩn nó nếu người dùng nhập một số văn bản.
Andrew Romanov

Xin mọi người có thể giúp tôi với câu hỏi sau đây? Nếu người dùng viết văn bản có dấu đầu dòng (ngắt nhiều dòng) trong UITextView, làm thế nào để phát hiện tổng số lần ngắt dòng?
Markus

@Markus bạn nên mở một câu hỏi mới cho điều đó
Nathan F.

20

Bạn có thể giả mạo UITextField bằng UITextView. Vấn đề bạn sẽ gặp phải là bạn mất chức năng giữ chỗ.

Nếu bạn chọn sử dụng UITextView và cần giữ chỗ, hãy làm điều này:

Trong viewDidLoad của bạn, đặt màu và văn bản cho trình giữ chỗ:

myTxtView.textColor = .lightGray
myTxtView.text = "Type your thoughts here..."

Sau đó làm cho giữ chỗ biến mất khi UITextView của bạn được chọn:

func textViewDidBeginEditing (textView: UITextView) {
    if myTxtView.textColor.textColor == ph_TextColor && myTxtView.isFirstResponder() {
        myTxtView.text = nil
        myTxtView.textColor = .white
    }
}

Khi người dùng hoàn thành chỉnh sửa, đảm bảo có một giá trị. Nếu không có, thêm lại giữ chỗ:

func textViewDidEndEditing (textView: UITextView) {
    if myTxtView.text.isEmpty || myTxtView.text == "" {
        myTxtView.textColor = .lightGray
        myTxtView.text = "Type your thoughts here..."
    }
}

Các tính năng khác bạn có thể cần phải giả mạo:

UITextField thường viết hoa mỗi chữ cái, bạn có thể thêm tính năng đó vào UITableView:

myTxtView.autocapitalizationType = .words

UITextField không thường cuộn:

myTxtView.scrollEnabled = false

18

Ok tôi đã làm điều đó với một số mẹo;) Trước tiên hãy xây dựng UITextFieldvà tăng nó sizenhư thế này:

CGRect frameRect = textField.frame;
        frameRect.size.height = 53;
        textField.frame = frameRect;

Sau đó, xây dựng UITextViewchính xác trong cùng một khu vực mà bạn đã tạo ra UITextFieldvà xóa nó background color. Bây giờ có vẻ như bạn có nhiều dòng TextField!


2
Tôi đã sử dụng bố trí tự động và ghim tất cả các mặt của UITextField vào UITextView. Thủ thuật thực sự tuyệt vời, cảm ơn!
phatmann

xin vui lòng @phantmann, bạn có thể cho chúng tôi xem mã của bạn để bố trí tự động không?
Esteve

8
Điều này tạo ra một UITextView. Điểm có UITextField là nó hoạt động khác với a UITextView.
Symate Nate

2
Có một loạt các khác biệt giữa UITextViewUITextfield: chúng kế thừa từ UIScrollViewvs UIControl, không thể chỉnh sửa theo mặc định so với có thể chỉnh sửa theo mặc định, đa dòng so với một dòng, giao thức ủy nhiệm khác nhau, không giữ chỗ so với giữ chỗ.
Sam Ballantyne

UITextViewdành cho các đoạn văn bản. Sử dụng nó nếu bạn cần một đoạn văn bản, và không thì.
Sam Ballantyne

9

Ngoài hành vi nhiều dòng, sự khác biệt chính giữa UITextView và UITextField là UITextView không đề xuất một trình giữ chỗ. Để bỏ qua giới hạn này, bạn có thể sử dụng UITextView với "trình giữ chỗ giả mạo".

Xem câu hỏi SO này để biết chi tiết: Trình giữ chỗ trong UITextView .


2

Nếu bạn phải có UITextField với 2 dòng văn bản, một tùy chọn là thêm một UILabel dưới dạng một khung nhìn phụ của UITextField cho dòng văn bản thứ hai. Tôi có một UITextField trong ứng dụng của mình mà người dùng thường không nhận ra là có thể chỉnh sửa bằng cách nhấn và tôi muốn thêm một số văn bản phụ đề nhỏ có nội dung "Nhấn để chỉnh sửa" vào UITextField.

CGFloat tapLlblHeight = 10;
UILabel *tapEditLbl = [[UILabel alloc] initWithFrame:CGRectMake(20, textField.frame.size.height - tapLlblHeight - 2, 70, tapLlblHeight)];
tapEditLbl.backgroundColor = [UIColor clearColor];
tapEditLbl.textColor = [UIColor whiteColor];
tapEditLbl.text = @"Tap to Edit";

[textField addSubview:tapEditLbl];

2

Có, một UITextView là những gì bạn đang tìm kiếm. Bạn sẽ phải xử lý một số thứ khác nhau (như phím trả về) nhưng bạn có thể thêm văn bản vào đó và nó sẽ cho phép bạn cuộn lên xuống nếu có quá nhiều văn bản bên trong.

Liên kết này có thông tin về cách tạo màn hình để nhập dữ liệu:

tạo màn hình nhập dữ liệu



0

Một bổ sung cho câu trả lời của h4xxr ở trên, một cách dễ dàng hơn để điều chỉnh chiều cao của UITextField là chọn kiểu viền vuông trong trình kiểm tra thuộc tính-> Trường văn bản. (Theo mặc định, kiểu viền của UITextfield là hình elip.)

Tham khảo: Đã trả lời Brian tại đây: Làm cách nào để đặt chiều cao UITextField?


-1

Có một lựa chọn khác phù hợp với tôi:

Phân lớp UITextField và ghi đè:

- (void)drawTextInRect:(CGRect)rect

Trong phương pháp này, bạn có thể ví dụ:

    NSDictionary *attributes = @{ NSFontAttributeName : self.font,
                                  NSForegroundColorAttributeName : self.textColor };

    [self.text drawInRect:verticalAlignedRect withAttributes:attributes];

Mã này sẽ hiển thị văn bản bằng cách sử dụng nhiều dòng theo yêu cầu nếu chỉnh lưu có đủ không gian. Bạn có thể chỉ định bất kỳ thuộc tính khác tùy thuộc vào nhu cầu của bạn.

Không được dùng:

self.defaultTextAttributes

Điều này sẽ buộc kết xuất văn bản một dòng

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.