ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [레인스톤 iOS] 자연스럽게 이미지 늘려보기 feat. 나인패치(비슷한거)
    iOS 실무 꿀팁 2022. 3. 8. 19:44
    반응형

    안녕하세요:)

    iOS 개발자로 일하고 있는 레인스톤입니다.

     

    안드로이드 플랫폼에서는 나인패치 형식이 지원되기 때문에

    화면 해상도에 따라 늘어나지 않을 영역을 지정해서 이미지가 뭉개지는(?) 현상을 방지할 수 있습니다.

     

    안타깝게도 iOS에서는 나인패치 형식이 지원되지 않습니다 ㅠㅠ

    하지만! Image - Asset의 Slicing을 활용하면 가능합니다.

    그럼 오늘은 iOS에서 나인패치Like한 기술을 적용해보겠습니다!

     

    뭘 하고자 하냐면

    텍스트 count에 따라 늘어나는 말풍선을 만들고자합니다.

    짧은 텍스트일 경우에는...

     

     

    아무 것도 적용하지 않아도 문제 없이 보이는 것 같습니다.

    그럼 텍스트가 길어졌을 때는 어떻게 달라지는지 볼까요?

     

     

     

    오... 뭔가 텍스트 길이에 따라 말풍선이 늘어나긴했지만?

    짧은 텍스트일 때와 비교해서 말풍선 모양이 뭉개져버렸죠?

    이걸 짧을 때와 마찬가지로 이~쁘~게 만들어볼 예정입니다.

    Assets → Slicing

    아래 그림과 같이 Xcode의 assets로 이동합니다.

    그리고 원하는 이미지를 선택한 후 4번째 탭(Image set)으로 이동합니다.

     

     

    Image set으로 이동 후 맨 아래를 보면 Slicing이 None으로 되어있습니다.

     

     

    이걸 Horizontal로 바꿔줍니다.

    세로로 늘려야할 경우에는 Vertical 이겠죠?

    가로&세로 모두 늘려야할 경우는 Horizontal and Vertical로 설정해주시면됩니다.

     

     

    자 이제 보시면 Left와 Right에 무언가 숫자를 입력해줘야겠죠?

    바로 고정될 영역의 크기를 지정해주는 것입니다.

    Horizontal의 경우 Left, Right이고 Vertical의 경우 Top, Bottom입니다.

     

    Center에는 Tiles 또는 Stretches 두 가지 옵션이 있습니다.

    Tiles는 늘어나는 영역이 타일형태로 표현되고, Streches는 하나가 쭉~ 늘어나도록 표현됩니다.

    제가 원하는건 Streches겠죠?

     

    결과 확인

    짜잔~

     

     

    어떤가요 고정된 영역의 모양은 유지되면서 이쁘게 늘어났죠?

    아래는 해당 프로젝트의 코드입니다.

    끗!

     

    ViewController

    import UIKit
    
    final class ViewController: UIViewController {
    
        private let speechBalloonView = SpeechBalloonView()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            speechBalloonView.configure(with: "짧은 텍스트입니다.")
            
            view.addSubview(speechBalloonView)
            speechBalloonView.snp.makeConstraints {
                $0.centerX.centerY.equalToSuperview()
            }
        }
    }

     

    SpeechBallonView

    import UIKit
    import SnapKit
    import Then
    
    final class SpeechBalloonView: UIView {
        
        private let cloudImageView = UIImageView()
        private let speechLabel = UILabel()
        
        override init(frame: CGRect) {
            super.init(frame: .zero)
            setupUI()
        }
        
        required init?(coder: NSCoder) {
            super.init(coder: coder)
            setupUI()
        }
        
        func configure(with text: String) {
            self.speechLabel.text = text
        }
    }
    
    private extension SpeechBalloonView {
        
        func setupUI() {
            
            cloudImageView.do {
                $0.image = UIImage(named: "cloud")
            }
            
            speechLabel.do {
                $0.numberOfLines = 1
                $0.setContentHuggingPriority(.required, for: .horizontal)
                $0.textColor = .white
                $0.font = .boldSystemFont(ofSize: 13)
            }
            
            
            addSubview(cloudImageView)
            addSubview(speechLabel)
            
            self.snp.makeConstraints {
                $0.height.equalTo(36)
            }
            
            cloudImageView.snp.makeConstraints {
                $0.edges.equalToSuperview()
            }
            
            speechLabel.snp.makeConstraints {
                $0.leading.trailing.equalToSuperview().inset(10)
                $0.top.equalToSuperview().inset(9)
                $0.bottom.equalToSuperview().inset(11)
            }
        }
    }
    반응형

    댓글

Designed by Tistory.