[Flutter] Portrait, Landscape mode 막기
2023. 3. 28. 00:17ㆍDevelopers 공간 [Shorts]/Frontend
728x90
반응형
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew,
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter
- Module Bundler : React, Webpack, Parcel
B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS
C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight
1. What? (현상)
화면 구성을 마쳤는데, device에서 화면을 돌릴 때마다 MediaQuery를 기반으로 설계한 UI가 바뀌면서, 화면이 깨지는 현상이 있습니다.
물론 아래와 같이 portrait(세로모드)인지 landscape(가로모드)인지를 감지해서 따로 구현해줄 수도 있지만, 아예 orientation을 하나로 픽스하려고 합니다.
if (MediaQuery.of(context).orientation == Orientation.portrait){
// is portrait
}else{
// is landscape
}
2. Why? (원인)
- system에서 아예 막아놓아야 합니다.
3. How? (해결책)
- main.dart의 main() 함수에 아래와 같이 setPreferredOrientations() 셋팅을 해줍니다.
- systemChrome은 OS의 graphical interface를 컨트롤하기 위한 클래스입니다. 아래와 같이 Orientation을 셋팅하거나, Rotation을 통해 full screen이 가능하도록 하는 setEnabledSystemUIMode() 등을 활용할 수 있습니다.
- 저의 경우는 가장 기본적인 portraitUp만 살려두었습니다.
import 'package:flutter/services.dart';
void main() async {
await SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight
]);
runApp(new MyApp());
}
- iOS를 위한 추가 셋팅
- ios/Runner/Info.plist 내의 아래의 UISupportedUnterfaceOrientations key내부에 아래의 항목만 놔두고 지워주면 됩니다.
- 혹은 아래 그림처럼 open ios/Runner.xcworkspace 명령어를 통해 연 후 Device Orientation에 항목을 해제해줍니다.
- 이후에 ios에서 pod install을 다시 진행해줍니다.
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
- Android를 위한 추가 셋팅
- android/app/src/main/AndroidManifest.xml 내부의 android:screenOrientation="portrait"을 추가해줍니다.
++ 추가 팁: 다른 위젯의 경우 내부적으로 Orientation 변화에 대해 막는 기능이 따로 필요할 수도 있습니다
ex) await cameraController?.lockCaptureOrientation();
https://api.flutter.dev/flutter/services/SystemChrome-class.html
728x90
반응형
'Developers 공간 [Shorts] > Frontend' 카테고리의 다른 글
[Flutter] Stacked에서 view와 viewModel의 생성 순서 (0) | 2023.04.02 |
---|---|
[Flutter] 버튼에 애니메이션 넣기 (0) | 2023.03.28 |
[Flutter] ios 셋팅 수정 및 다양한 상황에서 문제 해결하기 (0) | 2023.03.27 |
[Flutter] 카메라 촬영 후 보이는 그대로 저장하기 (1) | 2023.03.26 |
[Flutter] 이미지와 파일을 위한 Storage 다루기 (0) | 2023.03.25 |