使用按钮以编程方式更改方向 - iOS
Change orientation programmatically with button - iOS
我有一个view controller,我想有以下的体验。
在视图控制器内,我有一个按钮,它强制将方向旋转到右横向。
在部署信息 - 设备方向中我启用了 "Landscape Right" 和 "Portrait"。
我想提一下,在我的设备中我已经启用了 "Portrait Orientation Lock" 这就是为什么我想要一个按钮以编程方式使用以下代码旋转方向。
let rotateButton: UIButton = {
let btn = UIButton(type: .system)
btn.setTitle("Rotate", for: .normal)
btn.setTitleColor(.red, for: .normal)
btn.addTarget(self, action: #selector(rotateTapped), for: .touchUpInside)
return btn
}()
@objc func rotateTapped() {
let value = UIInterfaceOrientation.landscapeRight.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
所以上面的代码可以正常工作并且屏幕在旋转。
虽然我希望当用户旋转回纵向时,屏幕可以在不按下任何按钮的情况下再次旋转到纵向。
当 "Portrait Orientation Locked" 开启时,屏幕不会旋转回纵向。
我尝试了以下代码但没有成功。
1)
NotificationCenter.default.addObserver(self, selector: #selector(rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
@objc func rotated() {
if UIDevice.current.orientation.isLandscape {
print("Landscape") //when the user taps the button this is being printed.
} else {
print("Portrait") //when the user rotates back to portrait this is NOT being printed.
}
}
和 2)
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.current.orientation == .landscapeRight {
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
}
知道当用户再次旋转 phone 时会变回纵向吗?
我没有 swift 代码。下面是 objective c
代码,它对我有用。您可以根据需要将其转换为 swift。
目标 C
UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;
NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
[UIViewController attemptRotationToDeviceOrientation];
更新
Swift 4.0
var value = UIInterfaceOrientation.landscapeRight.rawValue
if UIApplication.shared.statusBarOrientation == .landscapeLeft || UIApplication.shared.statusBarOrientation == .landscapeRight{
value = UIInterfaceOrientation.portrait.rawValue
}
UIDevice.current.setValue(value, forKey: "orientation")
UIViewController.attemptRotationToDeviceOrientation()
以上代码已经过我的测试,运行良好。如果上面的代码不适合你,那么在使用 performSelector
.
延迟一段时间后执行它
var currentOrientation: UIInterfaceOrientation = UIApplication.shared.statusBarOrientation
var value = .landscapeRight
UIDevice.current.setValue(value, forKey: "orientation")
UIViewController.attemptRotationToDeviceOrientation()
我有一个view controller,我想有以下的体验。 在视图控制器内,我有一个按钮,它强制将方向旋转到右横向。
在部署信息 - 设备方向中我启用了 "Landscape Right" 和 "Portrait"。
我想提一下,在我的设备中我已经启用了 "Portrait Orientation Lock" 这就是为什么我想要一个按钮以编程方式使用以下代码旋转方向。
let rotateButton: UIButton = {
let btn = UIButton(type: .system)
btn.setTitle("Rotate", for: .normal)
btn.setTitleColor(.red, for: .normal)
btn.addTarget(self, action: #selector(rotateTapped), for: .touchUpInside)
return btn
}()
@objc func rotateTapped() {
let value = UIInterfaceOrientation.landscapeRight.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
所以上面的代码可以正常工作并且屏幕在旋转。 虽然我希望当用户旋转回纵向时,屏幕可以在不按下任何按钮的情况下再次旋转到纵向。 当 "Portrait Orientation Locked" 开启时,屏幕不会旋转回纵向。
我尝试了以下代码但没有成功。
1)
NotificationCenter.default.addObserver(self, selector: #selector(rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
@objc func rotated() {
if UIDevice.current.orientation.isLandscape {
print("Landscape") //when the user taps the button this is being printed.
} else {
print("Portrait") //when the user rotates back to portrait this is NOT being printed.
}
}
和 2)
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.current.orientation == .landscapeRight {
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
}
知道当用户再次旋转 phone 时会变回纵向吗?
我没有 swift 代码。下面是 objective c
代码,它对我有用。您可以根据需要将其转换为 swift。
目标 C
UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation;
NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
[UIViewController attemptRotationToDeviceOrientation];
更新
Swift 4.0
var value = UIInterfaceOrientation.landscapeRight.rawValue
if UIApplication.shared.statusBarOrientation == .landscapeLeft || UIApplication.shared.statusBarOrientation == .landscapeRight{
value = UIInterfaceOrientation.portrait.rawValue
}
UIDevice.current.setValue(value, forKey: "orientation")
UIViewController.attemptRotationToDeviceOrientation()
以上代码已经过我的测试,运行良好。如果上面的代码不适合你,那么在使用 performSelector
.
var currentOrientation: UIInterfaceOrientation = UIApplication.shared.statusBarOrientation
var value = .landscapeRight
UIDevice.current.setValue(value, forKey: "orientation")
UIViewController.attemptRotationToDeviceOrientation()