UITextField 텍스트를 세로로 가운데에 배치하려면 어떻게합니까?


143

나는 단순히 UITextField텍스트를 세로로 가운데에 두지 않는다는 것을 알리고 주목하고 있습니다. 대신, 그것은 버튼의 상단과 같은 높이이며, 기본값이 수직으로 가운데에 오를 것으로 예상하기 때문에 이상하게 보입니다. 세로로 가운데에 맞추거나 누락 된 기본 설정이 있습니까?

답변:


369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

빠른 사용에서 :

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center

1
@ user353877 : 이것은 여전히 ​​잘 작동합니다. Roger의 응답에서 textField그의 UITextField인스턴스 이름은 귀하 의 이름과 다를 수 있습니다. 그래서 그는 같은 것을 가질 것 UITextField *textField = [[UITextField alloc] init];입니다. 다른 변수 이름 (이외의 다른 사용하는 경우 textField애프터을 *), 당신은 할 필요가 yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter대신.
GeneralMike

@ user353877 "중앙"바로 앞에 점을 추가하십시오. UIControlContentVerticalAlignment.Center;
Josh

1
UITextView에 대해 동일한 방법이 있습니까?
CaffeineShots

이 숙박 시설과 동등한 시설이 있습니까?
demonofthemist

2
Swift 3.0에서는 다음과 같이 열거 형을 사용하는 것이 좋습니다.textField.contentVerticalAlignment = .center
Glenn

9

이것은 잠재적으로 몇 가지 복잡한 요소를 가지고 있으며, 일부는 이전 답변에서 암시되었습니다.

  • 정렬하려는 것 (숫자, 문자, 대문자 또는 혼합)
  • 자리 표시 자
  • 지우기 버튼

어떤 글꼴에있는 점의 수직으로 인한 라인 높이, 어 센더, 디 센더 등을 중심으로해야하기 때문에 당신이 정렬하려는 것은 중요하다 (소스 ilovetypography.com ) 에 (이미지 덕분에 http://ilovetypography.com/2009 / 01 / 14 / 눈에 띄지 않는 수직 메트릭 / )
세로 글꼴 특성


예를 들어 숫자 만 다룰 때는 표준 중심 정렬이 제대로 보이지 않습니다. 아래의 코드에서 동일한 정렬을 사용하는 두 가지의 차이점을 비교하십시오. 하나는 정확하고 다른 것은 약간 다르게 보입니다.

여러 글자가 섞여서 옳지 않습니다.

중심이 아닌 글자

하지만 그냥 숫자라면 제대로 보입니다

중심으로 보이는 숫자

불행히도 시각적으로 올바르게 보이려면 약간의 시행 착오와 수동 조정이 필요할 수 있습니다.

아래 코드를 UITextField의 하위 클래스에 배치했습니다. 존재하는 지우기 버튼을 고려하여 수퍼 클래스 메소드를 호출합니다.

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하고 다른 두 기능에서 호출했습니다. :)
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.