iOS 실무 꿀팁

[레인스톤 iOS] 자연스럽게 이미지 늘려보기 feat. 나인패치(비슷한거)

레인스톤 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)
        }
    }
}
반응형