본문 바로가기

iOS 프로그래밍

[swift] label 위쪽 정렬

위와 같은 제목을 치면 아래와 같은 포스팅 들이 많이 나온다

내가 원하지 않았던 포스팅 이미지

하지만 

원하던 형태
원하지 않는 형태

나는 이러한 button 두개를 하나의 view에 넣어 높이를 맞추어야 하는 상황에서

sizeToFit을 하면 view의 높이를 알 수 없었기 때문에 반드시 위쪽 정렬이 필요하다 느꼈다.

 

그래서 찾아본 결과

 

기존에 CustomButton에서 사용하던 UILabel 대신 VerticalAlignLabel형을 명시해줌으로서 간단히 해결할 수 있었다.

위와 같은 버튼을 만드는 법을 알고 싶은 분이라면 

이전 포스팅을 참고하시길 바랍니다.

 

public class VerticalAlignLabel: UILabel {
    enum VerticalAlignment {
        case top
        case middle
        case bottom
    }

    var verticalAlignment : VerticalAlignment = .top {
        didSet {
            setNeedsDisplay()
        }
    }

    override public func textRect(forBounds bounds: CGRect, limitedToNumberOfLines: Int) -> CGRect {
        let rect = super.textRect(forBounds: bounds, limitedToNumberOfLines: limitedToNumberOfLines)

        if UIView.userInterfaceLayoutDirection(for: .unspecified) == .rightToLeft {
            switch verticalAlignment {
            case .top:
                return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
            case .middle:
                return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y + (bounds.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height)
            case .bottom:
                return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y + (bounds.size.height - rect.size.height), width: rect.size.width, height: rect.size.height)
            }
        } else {
            switch verticalAlignment {
            case .top:
                return CGRect(x: bounds.origin.x, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
            case .middle:
                return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height)
            case .bottom:
                return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height), width: rect.size.width, height: rect.size.height)
            }
        }
    }

    override public func drawText(in rect: CGRect) {
        let r = self.textRect(forBounds: rect, limitedToNumberOfLines: self.numberOfLines)
        super.drawText(in: r)
    }
}

소스 출처:

https://stackoverflow.com/questions/7192088/how-to-set-top-left-alignment-for-uilabel-for-ios-application