ฉันแค่ยกตัวอย่างUITextField
และสังเกตว่าข้อความไม่ได้อยู่ในแนวตั้ง แต่มันก็เปี่ยมไปด้วยปุ่มบนของฉันซึ่งฉันรู้สึกแปลก ๆ เพราะฉันคาดว่าค่าเริ่มต้นจะอยู่ตรงกลางในแนวตั้ง ฉันจะจัดกึ่งกลางภาพในแนวตั้งหรือตั้งค่าเริ่มต้นบางอย่างที่ฉันขาดหายไปได้อย่างไร
ฉันแค่ยกตัวอย่างUITextField
และสังเกตว่าข้อความไม่ได้อยู่ในแนวตั้ง แต่มันก็เปี่ยมไปด้วยปุ่มบนของฉันซึ่งฉันรู้สึกแปลก ๆ เพราะฉันคาดว่าค่าเริ่มต้นจะอยู่ตรงกลางในแนวตั้ง ฉันจะจัดกึ่งกลางภาพในแนวตั้งหรือตั้งค่าเริ่มต้นบางอย่างที่ฉันขาดหายไปได้อย่างไร
คำตอบ:
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
ในการใช้งานอย่างรวดเร็ว:
textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
textField.contentVerticalAlignment = .center
สิ่งนี้อาจมีปัจจัยที่ซับซ้อนหลายประการซึ่งบางคำพาดพิงถึงคำตอบก่อนหน้า:
สิ่งที่คุณพยายามจัดแนวนั้นมีความสำคัญเนื่องจากจุดใดในแบบอักษรควรอยู่กึ่งกลางแนวตั้งเนื่องจากความสูงของบรรทัด, ตัวชี้ขึ้น, ตัวลงและอื่น ๆ(ที่มา: 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 :)
ในกระดานเรื่องราว: ภายใต้การควบคุม -> เปลี่ยนการจัดตำแหน่งแนวตั้งและแนวนอนตามความต้องการของคุณ
วิธีนี้ใช้ได้ผลดีกับข้อความของ 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 และเวอร์ชั่นก่อนหน้า
textField
เป็นชื่อของUITextField
อินสแตนซ์ของเขา- คุณอาจแตกต่างออกไปUITextField *textField = [[UITextField alloc] init];
ดังนั้นเขาจะมีบางอย่างเช่น หากคุณใช้ชื่อตัวแปรอื่น (นอกเหนือจากtextField
หลัง*
) คุณต้องทำyourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter
แทน