- 개발환경
Swift5
DeviceKit 2.0 https://github.com/devicekit/DeviceKit
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”을 해주어야하는 번거로움이 있기 때문이다.