(Swift) iPhone 해상도별 오토레이아웃을 하는 2가지 방법

Hanulyun
5 min readFeb 6, 2020

--

iPhoneSE, 7, 11 등 가로*세로가 다양한 화면을 대응하기 위해 오토레이아웃이 필수인데, 나는 오토레이아웃을 적용하기 위해 두 가지 방법을 주로 사용하고 있다.

1. UIScrollView를 적용한 화면

페피앱 개발 시 디자인에서는 iPhoneX 해상도에 맞춰서 줬기때문에,
모든 constraint 값을 iPhoneX 가로와 다른 iPhone 가로 비율에 맞춰서 값을 적용했다.

// CGFloat와 Double에 대한 값을 iPhoneX 가로 사이즈 (375) 비율로 적용한 방법extension CGFloat { // Double도 동일
var adjusted: CGFloat {
let ratio: CGFloat = UIScreen.main.bounds.width / 375
return self * ratio
}
}
// 사용법
button.contentEdgeInsets = UIEdgeInsets(inset: 5.adjusted)

이렇게 하면 스크롤이 있는 화면은 아이폰 해상도에 맞추어 따로 작업해주지 않아도 오토레이아웃이 가능하다.

그리고 모든 폰트 사이즈 및 간격을 adjusted 값으로 사용했는데, 그러면 자동으로 조절되기 때문에 걱정할게 없다.

2. Scroll이 없는 화면

페피 앱을 만들면서 UIScrollView 를 적용하지 않고 한 화면에 모든 데이터가 다 보여야하는 화면이 있었고 아이폰 사이즈별 대응이 필요했다.

처음에는 아이폰 가로사이즈에 따라 Device를 구분할 수 있도록 코드로 짜서 사용했었다.

그 후 오토레이아웃 이외에 앱 품질 관리를 위해 현재 아이폰의 버전 확인 등도 필요해서 DeviceKit을 활용하는 방법으로 변경하게 되었다.

별도로 작업한 해상도는 iPhoneSE , iPhone7, iPhone7+이다. (8, 8+ 포함)

우선 해상도별로 구분해 DeviceGroup을 만든다.

// iOS12 이상 지원하는 Device array
// iPads는 유니버셜 앱이 아닐 때 애플 리뷰어가 테스트하기 때문에 넣었다.
public enum DeviceGroup {
case fourInches
case fiveInches
case xSeries
case iPads
public var rawValue: [Device] {
switch self {
case .fourInches:
return [.iPhone5s, .iPhoneSE]
case .fiveInches:
return [.iPhone6, .iPhone6s, .iPhone7, .iPhone8]
case .xSeries:
return Device.allXSeriesDevices
case .iPads:
return Device.allPads
}
}
}

그 후 DeviceManager 를 싱글톤으로 생성한다.

// DeviceManager라는 class를 생성해서 싱글톤으로 사용한다.
class DeviceManager {
static let shared: DeviceManager = DeviceManager()
func isFourIncheDevices() -> Bool {
return Device.current.isOneOf(DeviceGroup.fourInches.rawValue)
}
func isIPadDevices() -> Bool {
return Device.current.isOneOf(DeviceGroup.iPads.rawValue)
}
}

이제 다른 View에서 해상도별 오토레이아웃 값을 지정하면 된다.

// 주의 : 해상도별 값을 지정하기때문에 1번의 .adjusted는 쓰지 않는다.
if DeviceManager.shared.isFourInchesDevices() {
sampleView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 30).isActive = true
} else if DeviceManager.shared.isIPadDevices() {
sampleView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 50).isActive = true
}

싱글톤을 활용한 이유는 아이폰 버전 등을 처리하기 위해 Device에 대한 처리를 모아둔 Manager를 따로 만들기도 했고,

싱글톤을 사용하지 않으면 View마다 “import DeviceKit”을 해주어야하는 번거로움이 있기 때문이다.

--

--

Hanulyun
Hanulyun

Written by Hanulyun

iOS 주니어 개발자입니다. 개발하면서 막히는 부분을 해결한 후 기록으로 남깁니다. #Swift

No responses yet