5가지 언어 중 원하는 언어를 선택해주세요!
카메라를 켜고 실시간으로 번역을 사용해보세요
번역된 내용을 선택, 복사하여 기본 번역에서 추가 번역을 해보세요
5가지
Source Language
,Target Language
선택 및 전환 버튼 뷰
언어 선택 뷰를 별도의LanguageChangeButtonView
로 만들어 뷰를 재사용
DataScannerViewController
를 사용하여 실시간 번역 구현
실시간 번역 내용 선택 시 클립보드 복사
1초당 자동 번역 갱신되는 기본 번역 화면 구현
Serena 🐷 |
---|
로딩 화면 | 언어 선택 |
---|---|
실시간 번역 | 기본 번역 |
카메라 접근 권한 | 카메라 미지원 시 |
- 앱을 설치 후 처음 앱 구동 시
gif LoadingView
를 띄우고자 하였습니다. 이때, 외부라이브러리를 사용하여도LaunchScreen
에선gif
를 사용할 수 없다는 것을 알게되었습니다. - 이를 해결하기 위해
LaunchScreen
에서gif
의 첫 시작 사진을 넣고,LaunchScreen
이후 바로gif LoadingView
를 띄워주었습니다. 🔗 참고링크
DataScannerViewController
의isGuidanceEnabled=true
로 주게되는 경우 하기와 같은 에러가 발생하였습니다.
"<NSLayoutConstraint:0x282c22e40 H:|-(10)-[UILabel:0x12f3152e0](LTR) (active, names: '|':VKKeyboardCameraGuidanceView:0x12f3148a0 )>",
"<NSLayoutConstraint:0x282c22ee0 H:[UILabel:0x12f3152e0]-(10)-|(LTR) (active, names: '|':VKKeyboardCameraGuidanceView:0x12f3148a0 )>",
"<NSLayoutConstraint:0x282c22f30 VKKeyboardCameraGuidanceView:0x12f3148a0.width <= 0.666667*VKAVCapturePreviewView:0x12f313be0.width (active)>",
"<NSLayoutConstraint:0x282c39cc0 'UIView-Encapsulated-Layout-Width' VKAVCapturePreviewView:0x12f313be0.width == 0 (active)>"
- 이는
VKAVCapturePreviewView
의 가로폭사이즈가 지정되지 않으면서 생긴 문제라 생각되어,DataScannerViewController
의 View사이즈를 지정해줌으로 해결하였습니다.
dataScanner.view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
dataScanner.view.leadingAnchor.constraint(equalTo: realTimeView.scannerView.leadingAnchor),
dataScanner.view.trailingAnchor.constraint(equalTo: realTimeView.scannerView.trailingAnchor),
dataScanner.view.topAnchor.constraint(equalTo: realTimeView.scannerView.topAnchor),
dataScanner.view.bottomAnchor.constraint(equalTo: realTimeView.scannerView.bottomAnchor)
])
DataScannerViewController
의view
의 사이즈를RealTimeTranslateViewController
의realTimeView
의 사이즈에 맞추고자 하였습니다. 이때realTimeView
의 사이즈가viewDidLoad
에서 결정되지 않아 이 시점에서DataScannerViewController
의view
사이즈를 정할 수 없는 문제가 생겼습니다.- 하여
StackView
안에 있는realTimeView
의 사이즈가 결정된 시점인viewDidAppear
에서DataScannerViewController
의view
사이즈를 지정하였습니다.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if scannerAvailable {
startDataScanner()
} else {
refuseAdmission()
}
}
private func startDataScanner() {
dataScanner.view.frame = realTimeView.scannerView.bounds
try? dataScanner.startScanning()
}
-
실시간 번역 시 인식되는 텍스트 박스 위에 불투명한
Button
을 배치하고자 하였습니다. 이때, 단순히color
의alpha
값을 조정하여 사용하게 되면 오히려 텍스트의 가독성이 떨어졌습니다. -
이를 해결하고자
UIVisualEffect
를 사용하여 배경을blur
처리하고 그 위에text
가 배치될 수 있도록 하였습니다.
API
를 실시간으로 호출하기 위해Timer
를 사용하여 지정 시간마다 반복적으로API
호출을 하도록 구현하였습니다. 이때 각ViewController
의RC
가0
로 바뀌지 않는 문제가 생겼습니다.Timer
의 인스턴스가 유지되고 있다는 것을 발견하여ViewController
가viewWillDisappear
시Timer
를 삭제하였습니다.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
timer?.invalidate()
}
-
API
를 자동 반복 호출하기 때문에,API
호출 에러시 뜨는AlerController
의 창이 중복으로 호출된다는 문제가 생겼습니다. -
AlertController
는UIViewController
를 상속하기 떄문에UIViewController
의presentedViewController
프로퍼티를 사용하여present
로 호출된ViewController
가 있을 시AlertController
를 추가 호출하지 않도록 하였습니다.