ฉันจะจัดกึ่งกลางข้อความในแนวตั้ง UITextField ได้อย่างไร


143

ฉันแค่ยกตัวอย่างUITextFieldและสังเกตว่าข้อความไม่ได้อยู่ในแนวตั้ง แต่มันก็เปี่ยมไปด้วยปุ่มบนของฉันซึ่งฉันรู้สึกแปลก ๆ เพราะฉันคาดว่าค่าเริ่มต้นจะอยู่ตรงกลางในแนวตั้ง ฉันจะจัดกึ่งกลางภาพในแนวตั้งหรือตั้งค่าเริ่มต้นบางอย่างที่ฉันขาดหายไปได้อย่างไร

คำตอบ:


369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

ในการใช้งานอย่างรวดเร็ว:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center

1
@ user353877: ยังใช้งานได้ดี โปรดทราบว่าในการตอบกลับของโรเจอร์textFieldเป็นชื่อของUITextFieldอินสแตนซ์ของเขา- คุณอาจแตกต่างออกไป UITextField *textField = [[UITextField alloc] init];ดังนั้นเขาจะมีบางอย่างเช่น หากคุณใช้ชื่อตัวแปรอื่น (นอกเหนือจากtextFieldหลัง*) คุณต้องทำyourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenterแทน
GeneralMike

@ user353877 เพิ่มจุดก่อน "ศูนย์": UIControlContentVerticalAlignment.Center;
Josh

1
มีวิธีการเดียวกันสำหรับ UITextView
CaffeineShots

มีคุณสมบัติที่เทียบเท่ารวดเร็วหรือไม่
demonofthemist

2
ใน Swift 3.0 นี่เป็นวิธีที่แนะนำในการใช้ enum:textField.contentVerticalAlignment = .center
Glenn

9

สิ่งนี้อาจมีปัจจัยที่ซับซ้อนหลายประการซึ่งบางคำพาดพิงถึงคำตอบก่อนหน้า:

  • สิ่งที่คุณพยายามจัดตำแหน่ง (ตัวเลขเพียงตัวอักษรตัวอักษรตัวใหญ่หรือผสมเท่านั้น)
  • ตัวยึด
  • ปุ่มล้าง

สิ่งที่คุณพยายามจัดแนวนั้นมีความสำคัญเนื่องจากจุดใดในแบบอักษรควรอยู่กึ่งกลางแนวตั้งเนื่องจากความสูงของบรรทัด, ตัวชี้ขึ้น, ตัวลงและอื่น ๆ(ที่มา: ilovetypography.com ) (ภาพขอบคุณhttp://ilovetypography.com/2009 / 01/14 / ไม่เด่น - แนวตั้ง - ตัวชี้วัด / )
ลักษณะตัวอักษรแนวตั้ง


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

ไม่ถูกต้องนักเมื่อมีตัวอักษรผสมกัน:

จดหมายไม่อยู่กึ่งกลาง

แต่ดูถูกถ้าเป็นแค่ตัวเลข

ตัวเลขที่มองกึ่งกลาง

ดังนั้นน่าเสียดายที่มันอาจต้องมีการลองผิดลองถูกและการปรับด้วยตนเองเพื่อให้ได้ภาพที่ถูกต้อง

ฉันวางโค้ดด้านล่างไว้ในคลาสย่อยของ UITextField มันเรียกวิธีการ superclass เช่นนี้คำนึงถึงปุ่มชัดเจนที่มีอยู่

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)
}

ฉันคิดว่าการplaceholderRectForBoundsขยายไปทางขวามากเกินไป ฉันมีมุมมองที่ถูกต้องและมันเข้ากับมันไม่เหมือนขอบเขตอื่น ๆ ฉันเพิ่งติดตั้งtextRectForBoundsและเรียกมันจากอีก 2 funcs :)
Sasho

5

ในกระดานเรื่องราว: ภายใต้การควบคุม -> เปลี่ยนการจัดตำแหน่งแนวตั้งและแนวนอนตามความต้องการของคุณ

ป้อนคำอธิบายรูปภาพที่นี่


1

วิธีนี้ใช้ได้ผลดีกับข้อความของ textField แต่ถ้าคุณต้องการใช้ตัวแทนข้อความ (ข้อความที่จะปรากฏในขณะที่ฟิลด์ข้อความว่างเปล่า) บน iOS 7 คุณจะพบปัญหา

ฉันแก้ไขมันโดยการเอาชนะคลาส TextField และ

- (void) drawPlaceholderInRect:(CGRect)rect

วิธี.

แบบนี้:

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

ใช้ได้ทั้ง iOS7 และเวอร์ชั่นก่อนหน้า


คุณจัดการกับสิ่งนั้นใน Swift ได้อย่างไร เนื่องจาก self.placeholder.drawInRect ไม่มีอยู่ใน Swift
King-Wizard

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