Swift를 사용하여 하나의 ViewController에서 강제 가로 모드
가로 모드에서 내 응용 프로그램에서 하나의보기 만 강제하려고합니다.
override func shouldAutorotate() -> Bool {
print("shouldAutorotate")
return false
}
override func supportedInterfaceOrientations() -> Int {
print("supportedInterfaceOrientations")
return Int(UIInterfaceOrientationMask.LandscapeLeft.rawValue)
}
override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
return UIInterfaceOrientation.LandscapeLeft
}
뷰가 세로 모드로 시작되고 장치 방향을 변경할 때 계속 회전합니다.
shouldAutorotate는 호출되지 않습니다.
어떤 도움을 주시면 감사하겠습니다.
다른 사람들에게 유용 할 수 있습니다. 뷰를 가로 모드로 강제 실행하는 방법을 찾았습니다.
이것을 viewDidLoad ()에 넣으십시오.
let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
과,
override var shouldAutorotate: Bool {
return true
}
스위프트 4
override func viewDidLoad() {
super.viewDidLoad()
let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .landscapeLeft
}
override var shouldAutorotate: Bool {
return true
}
// 뷰가 내비게이션 컨트롤러에 내장 된 경우 위의 방법만으로는 작동하지 않습니다. 계단식으로 올라 가야합니다. // 클래스 정의 뒤에 다음 확장을 추가합니다.
extension UINavigationController {
override open var shouldAutorotate: Bool {
get {
if let visibleVC = visibleViewController {
return visibleVC.shouldAutorotate
}
return super.shouldAutorotate
}
}
override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
get {
if let visibleVC = visibleViewController {
return visibleVC.preferredInterfaceOrientationForPresentation
}
return super.preferredInterfaceOrientationForPresentation
}
}
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get {
if let visibleVC = visibleViewController {
return visibleVC.supportedInterfaceOrientations
}
return super.supportedInterfaceOrientations
}
}}
스위프트 3
override func viewDidLoad() {
super.viewDidLoad()
let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
private func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.landscapeLeft
}
private func shouldAutorotate() -> Bool {
return true
}
iOS 11 에서 테스트 된 Swift 4
projectTarget-> General-> DeploymentInfo (Device Orientation)-> Portrait (Landscapeleft 및 Landscaperight는 선택 사항) 에서 방향을 지정할 수 있습니다.
AppDelegate
var myOrientation: UIInterfaceOrientationMask = .portrait
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return myOrientation
}
LandScpaeViewController
override func viewDidLoad() {
super.viewDidLoad()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.myOrientation = .landscape
}
OnDismissButtonTap
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.myOrientation = .portrait
그게 다야. :)
Swift 2.2 사용
시험:
let value = UIInterfaceOrientation.LandscapeLeft.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")
뒤에 :
UIViewController.attemptRotationToDeviceOrientation()
Apple의 UIViewController 클래스 참조에서 :
일부 뷰 컨트롤러는 지원되는 인터페이스 방향을 결정하기 위해 앱별 조건을 사용할 수 있습니다. 뷰 컨트롤러가이 작업을 수행하면 해당 조건이 변경되면 앱에서이 클래스 메서드를 호출해야합니다. 시스템은 즉시 새 방향으로 회전을 시도합니다.
그런 다음 다른 사람들이 제안한대로 적절하게 다음 메서드를 재정의합니다.
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.LandscapeLeft
}
override func shouldAutorotate() -> Bool {
return true
}
나는 서명보기와 비슷한 문제가 있었고 이것이 나를 위해 해결했습니다.
저에게 가장 좋은 결과는 Zeesha의 대답과 sazz의 대답을 결합한 것입니다.
AppDelegate.swift에 다음 줄을 추가합니다.
var orientationLock = UIInterfaceOrientationMask.portrait
var myOrientation: UIInterfaceOrientationMask = .portrait
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return myOrientation
}
뷰 컨트롤러 클래스에 다음 줄을 추가합니다.
let appDel = UIApplication.shared.delegate as! AppDelegate
뷰 컨트롤러에 다음 줄을 추가하십시오 viewDidLoad()
.
appDel.myOrientation = .landscape
UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")
(선택 사항) 닫기 기능에 다음 행을 추가하십시오.
appDel.myOrientation = .portrait
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
이 코드 줄은 기본 방향을 세로로 설정하고 뷰 컨트롤러가로드 될 때 가로로 회전 한 다음 마지막으로 뷰 컨트롤러가 닫히면 다시 세로로 재설정합니다.
컨트롤러 하나를 세로 방향으로 강제해야했습니다. 이것을 추가하면 나를 위해 일했습니다.
iOS 11을 탑재 한 신속한 4
override var supportedInterfaceOrientations : UIInterfaceOrientationMask{
return .portrait
}
Swift 2.2에서 작동
func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask {
if self.window?.rootViewController?.presentedViewController is SignatureViewController {
let secondController = self.window!.rootViewController!.presentedViewController as! SignatureViewController
if secondController.isPresented {
return UIInterfaceOrientationMask.LandscapeLeft;
} else {
return UIInterfaceOrientationMask.Portrait;
}
} else {
return UIInterfaceOrientationMask.Portrait;
}
}
Swift 3. 이것은 사용자가 앱을 다시 열 때마다 방향을 잠급니다.
class MyViewController: UIViewController {
...
override func viewDidLoad() {
super.viewDidLoad()
// Receive notification when app is brought to foreground
NotificationCenter.default.addObserver(self, selector: #selector(self.onDidBecomeActive), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)
}
// Handle notification
func onDidBecomeActive() {
setOrientationLandscape()
}
// Change orientation to landscape
private func setOrientationLandscape() {
if !UIDevice.current.orientation.isLandscape {
let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey:"orientation")
UIViewController.attemptRotationToDeviceOrientation()
}
}
// Only allow landscape left
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.landscapeLeft
}
/*
// Allow rotation - this seems unnecessary
private func shouldAutoRotate() -> Bool {
return true
}
*/
...
}
스위프트 4
방향을 유지하려고 노력하면 아무것도 효과가 없었지만 이것은 나를 위해 :
...
override func viewDidLoad() {
super.viewDidLoad()
forcelandscapeRight()
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(forcelandscapeRight), name: Notification.Name.UIDeviceOrientationDidChange, object: nil)
}
@objc func forcelandscapeRight() {
let value = UIInterfaceOrientation.landscapeRight.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
....
viewDidLoad 메서드의 ViewController에서 함수 아래 호출
func rotateDevice(){
UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")
UIView.setAnimationsEnabled(true) // while rotating device it will perform the rotation animation
}`
앱 위임 파일 기능 및 변수 아래에 추가
//Orientation Variables
var orientationLock = UIInterfaceOrientationMask.portrait
var myOrientation: UIInterfaceOrientationMask = .portrait
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return .landscape }
받는 따르면 supportedInterfaceOrientations 문서화shouldAutorotate
방법 돌려 true
또는 YES
오브젝티브 C에이되도록 supportedInterfaceOrientations
고려된다.
내 해결책은
AppDelegate의 코드 아래에 추가되었습니다.
enum PossibleOrientations {
case portrait
case landscape
func o() -> UIInterfaceOrientationMask {
switch self {
case .portrait:
return .portrait
case .landscape:
return .landscapeRight
}
}
}
var orientation: UIInterfaceOrientationMask = .portrait
func switchOrientation(to: PossibleOrientations) {
let keyOrientation = "orientation"
if to == .portrait && UIDevice.current.orientation.isPortrait {
return
} else if to == .landscape && UIDevice.current.orientation.isLandscape {
return
}
switch to {
case .portrait:
orientation = .portrait
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: keyOrientation)
case .landscape:
orientation = .landscapeRight
UIDevice.current.setValue(UIInterfaceOrientation.landscapeRight.rawValue, forKey: keyOrientation)
}
}
변경하려면 아래 코드를 호출하십시오.
override func viewDidLoad() {
super.viewDidLoad()
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
appDelegate.switchOrientation(to: .landscape)
}
}
또는 아래와 같이
@IBAction func actBack() {
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
appDelegate.switchOrientation(to: .portrait)
}
self.navigationController?.popViewController(animated: true)
}
// below code put in view controller
// you can change landscapeLeft or portrait
override func viewWillAppear(_ animated: Bool) {
UIDevice.current.setValue(UIInterfaceOrientation.landscapeRight.rawValue, forKey: "orientation")
}
override var shouldAutorotate: Bool {
return true
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .landscapeRight
}
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
return .landscapeRight
}
AppDelegate에서 이것을 추가하십시오.
//Orientation Variables
var myOrientation: UIInterfaceOrientationMask = .portrait
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask
{
return myOrientation
}
방향을 변경하려는 viewController에 이것을 추가하십시오.
override func viewDidLoad() {
super.viewDidLoad()
self.rotateToLandsScapeDevice()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.rotateToPotraitScapeDevice()
}
func rotateToLandsScapeDevice(){
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.myOrientation = .landscapeLeft
UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")
UIView.setAnimationsEnabled(true)
}
func rotateToPotraitScapeDevice(){
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.myOrientation = .portrait
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
UIView.setAnimationsEnabled(true)
}
class CustomUIViewController : UIViewController{
override var supportedInterfaceOrientations : UIInterfaceOrientationMask{
return .landscapeLeft
}
}
class ViewController: CustomUIViewController {
.
.
.
}
참고 URL : https://stackoverflow.com/questions/27037839/force-landscape-mode-in-one-viewcontroller-using-swift
'Programing' 카테고리의 다른 글
$ _GET이 있는지 확인하는 방법은 무엇입니까? (0) | 2020.12.10 |
---|---|
조각 관리자에서 오래된 조각 제거 (0) | 2020.12.10 |
IPython 노트북 셀 다중 출력 (0) | 2020.12.10 |
Django Admin : 하나의 모델 필드에만 사용자 정의 위젯 사용 (0) | 2020.12.10 |
jQuery를 사용하여 JSON 배열에 대한 루프 및 키 / 값 쌍 가져 오기 (0) | 2020.12.10 |