วิธีการสร้างหลายบรรทัด UITextfield


259

ฉันกำลังพัฒนาแอปพลิเคชันที่ผู้ใช้ต้องเขียนข้อมูลบางอย่าง เพื่อจุดประสงค์นี้ฉันต้องการUITextFieldซึ่งเป็นหลายบรรทัด (โดยทั่วไปUITextFieldคือบรรทัดเดียว)

ในขณะที่ฉันกำลังค้นหาฉันพบคำตอบของการใช้งานUITextViewแทนUITextfieldจุดประสงค์นี้


นี่คือการควบคุมขนาดเล็กที่ฉันเขียนเพื่อจุดประสงค์นั้น มันมีการสนับสนุนหลายสายและปุ่ม Done สำหรับการปิดแป้นพิมพ์ อย่าลังเลที่จะใช้มันcode.google.com/p/galtextfield
Gal Blank

2
ใช้คลาสบุคคลที่สามนี้นำเข้าโครงการ xcode ของคุณและใช้มันลิงก์ที่ใช้งานได้ดีเกินไป: github.com/adonoho/HPGrowingTextView
mahesh chowdary

คำตอบ:


435

UITextField โดยเฉพาะหนึ่งบรรทัดเท่านั้น

การค้นหา Google ของคุณถูกต้องคุณต้องใช้UITextViewแทนUITextFieldการแสดงและแก้ไขข้อความหลายบรรทัด

ในตัวสร้างส่วนต่อขยายเพิ่มUITextViewตำแหน่งที่คุณต้องการและเลือกกล่อง "แก้ไขได้" มันจะเป็น multiline โดยค่าเริ่มต้น


7
บอกฉันหน่อยได้ไหมว่าแอปปฏิทินพื้นเมืองทำให้ดูด้วยตัวยึดตำแหน่งและการตัดคำสำหรับโน้ตที่หน้าจอเพิ่มเหตุการณ์อย่างไร
Gennadiy Ryabkin

3
วิธีการตั้งค่าตัวยึดสำหรับ UITextView?
มณี

4
คุณไม่สามารถเพิ่มตัวยึดตำแหน่งให้กับ TextView แต่คุณสามารถเพิ่มป้ายกำกับสีเทาบน TextView และซ่อนหากผู้ใช้ป้อนข้อความ
Andrew Romanov

ใครก็ได้โปรดช่วยฉันด้วยคำถามต่อไปนี้? หากผู้ใช้เขียนข้อความแสดงหัวข้อย่อย (ตัวแบ่งบรรทัดหลายบรรทัด) ใน UITextView จะตรวจสอบจำนวนตัวแบ่งบรรทัดทั้งหมดได้อย่างไร
Markus

@ Markus คุณควรเปิดคำถามใหม่สำหรับสิ่งนั้น
นาธานเอฟ

20

คุณสามารถปลอม UITextField โดยใช้ UITextView ปัญหาที่คุณมีคือคุณสูญเสียฟังก์ชันการทำงานของตัวยึดตำแหน่ง

หากคุณเลือกที่จะใช้ UITextView และต้องการตัวยึดตำแหน่งให้ทำสิ่งนี้:

ใน viewDidLoad ของคุณให้ตั้งค่าสีและข้อความเป็นตัวยึดตำแหน่ง:

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

จากนั้นทำให้ตัวยึดตำแหน่งหายไปเมื่อคุณเลือก UITextView:

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

เมื่อผู้ใช้เสร็จสิ้นการแก้ไขตรวจสอบให้แน่ใจว่ามีค่า หากไม่มีให้เพิ่มตัวยึดตำแหน่งอีกครั้ง:

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

คุณสมบัติอื่น ๆ ที่คุณอาจจำเป็นต้องใช้ในการปลอม:

UITextField มักใช้ประโยชน์จากตัวอักษรทุกตัวคุณสามารถเพิ่มคุณสมบัตินั้นใน UITableView:

myTxtView.autocapitalizationType = .words

UITextField มักจะไม่เลื่อน:

myTxtView.scrollEnabled = false

18

ตกลงฉันทำมันด้วยเคล็ดลับ;) ก่อนสร้างUITextFieldและเพิ่มมันเป็นsizeเช่นนี้:

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

จากนั้นสร้างUITextViewว่าในพื้นที่เดียวกันกับที่มึงทำของฉันและลบของมันUITextField background colorตอนนี้ดูเหมือนว่าคุณจะมีหลายบรรทัดTextField!


2
ฉันใช้เลย์เอาต์อัตโนมัติและตรึงทุกด้านของ UITextField เป็น UITextView เคล็ดลับที่ดีจริงๆขอบคุณ!
phatmann

ได้โปรด @ phantmann คุณช่วยแสดงรหัสของคุณสำหรับการจัดวางอัตโนมัติได้ไหม?
Esteve

8
UITextViewนี้จะสร้าง จุดของการมี UITextField UITextViewคือว่ามันจะทำงานที่แตกต่างกว่า
Nate Symer

2
มีความแตกต่างระหว่างUITextViewและUITextfield: พวกเขาสืบทอดมาจากUIScrollViewvs UIControl, ไม่สามารถแก้ไขได้โดยเริ่มต้นกับแก้ไขได้โดยเริ่มต้น, multiline กับบรรทัดเดียว, โปรโตคอลผู้แทนที่แตกต่างกัน, ไม่มีตัวยึดตำแหน่งกับตัวยึดตำแหน่ง
Sam Ballantyne

UITextViewสำหรับย่อหน้าของข้อความ ใช้มันหากคุณต้องการย่อหน้าของข้อความไม่ใช่อย่างอื่น
Sam Ballantyne

9

นอกเหนือจากการทำงานหลายบรรทัดความแตกต่างที่สำคัญระหว่าง UITextView และ UITextField คือ UITextView ไม่ได้เสนอตัวยึดตำแหน่ง หากต้องการข้ามข้อ จำกัด นี้คุณสามารถใช้ UITextView กับ "ตัวยึดตำแหน่งปลอม"

ดูคำถาม SO นี้สำหรับรายละเอียด: ตัวยึดตำแหน่งใน UITextView


2

หากคุณต้องมี UITextField ที่มีข้อความ 2 บรรทัดตัวเลือกหนึ่งคือเพิ่ม UILabel เป็นมุมมองย่อยของ UITextField สำหรับบรรทัดข้อความที่สอง ฉันมี UITextField ในแอปของฉันที่ผู้ใช้มักไม่ทราบว่าสามารถแก้ไขได้ด้วยการแตะและฉันต้องการเพิ่มข้อความคำบรรยายเล็ก ๆ ที่ระบุว่า "แตะเพื่อแก้ไข" ใน 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

ใช่ UITextView คือสิ่งที่คุณกำลังมองหา คุณจะต้องจัดการกับบางสิ่งที่แตกต่าง (เช่นปุ่มย้อนกลับ) แต่คุณสามารถเพิ่มข้อความได้และมันจะช่วยให้คุณเลื่อนขึ้นและลงหากมีข้อความอยู่ภายในมากเกินไป

ลิงค์นี้มีข้อมูลเกี่ยวกับการสร้างหน้าจอเพื่อป้อนข้อมูล:

สร้างหน้าจอการป้อนข้อมูล



0

การเสริมคำตอบของ h4xxr ในข้างต้นวิธีที่ง่ายกว่าในการปรับความสูงของ UITextField คือการเลือกสไตล์เส้นขอบสี่เหลี่ยมในตัวตรวจสอบแอททริบิวต์ -> ฟิลด์ข้อความ (โดยค่าเริ่มต้นสไตล์เส้นขอบของ UITextfield คือวงรี)

การอ้างอิง: ตอบ Brian ในที่นี่: วิธีการตั้งค่าความสูง UITextField?


-1

มีตัวเลือกอื่นที่เหมาะกับฉัน:

คลาสย่อย UITextField และเขียนทับ:

- (void)drawTextInRect:(CGRect)rect

ในวิธีนี้คุณสามารถยกตัวอย่าง:

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

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

รหัสนี้จะแสดงข้อความโดยใช้บรรทัดมากที่สุดเท่าที่จำเป็นถ้า rect มีพื้นที่เพียงพอ คุณสามารถระบุคุณสมบัติอื่น ๆ ขึ้นอยู่กับความต้องการของคุณ

ไม่ได้ใช้:

self.defaultTextAttributes

ซึ่งจะบังคับให้แสดงข้อความบรรทัดเดียว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.