我正在制作绘图应用程序,我希望用户能够旋转其设备并以任何方向在画布上绘图。画笔/颜色/等工具栏需要更改方向以始终位于屏幕顶部,但是绘图画布无需更改方向(以保留绘图方向;请想象旋转一张带有绘图的纸-绘图有时会偏斜或颠倒,但铅笔仍在您的正前方。
我尝试了几次尝试并得出结论,我确实想支持iOS的默认方向更改,因为UIAlert弹出窗口之类的东西需要正确地定向。在视图控制器上实现override var supportedInterfaceOrientations: UIInterfaceOrientationMask
并非最佳选择。
通过订阅device orientation changed notifications
并以相反的方向旋转绘图画布,以补偿默认的UI方向旋转,我已经走近了。在这种情况下,我向画布容器视图应用了90,-90、0或180度的CGAffineTransform旋转,但是其子视图未随之正确旋转。
我可能缺少想要得到我想要的行为的想法吗?
这就是我要的。请注意,旋转后工具栏始终始终定向到顶部,但是工程图仍粘在设备上。
更改方向之前:
更改方向后:
最佳答案
我做了一个快速测试应用程序,以查看您是否体验到了什么(关于旋转画布视图而没有使其子视图也旋转),并且我无法复制您所看到的内容。
我只是从主视图上在viewDidLoad
上设置了一个观察者:
NotificationCenter.default.addObserver(self, selector:#selector(self.orientationChanged(_:)), name: NSNotification.Name.UIDeviceOrientationDidChange, object:nil)
方向更改通知的处理方式如下:
func orientationChanged(_ n:Notification) {
let orientation = UIDevice.current.orientation
if orientation == UIDeviceOrientation.portrait {
// No rotation
vwCanvas.transform = CGAffineTransform(rotationAngle:0)
} else if orientation == UIDeviceOrientation.portraitUpsideDown {
// Rotate canvas 180 degrees
vwCanvas.transform = CGAffineTransform(rotationAngle:CGFloat.pi)
} else if orientation == UIDeviceOrientation.landscapeLeft {
// Rotate canvas 90 degrees counterclockwise
vwCanvas.transform = CGAffineTransform(rotationAngle:CGFloat.pi/2.0)
} else if orientation == UIDeviceOrientation.landscapeRight {
// Rotate canvas 90 degrees clockwise
vwCanvas.transform = CGAffineTransform(rotationAngle:-CGFloat.pi/2.0)
}
}
这是我的纵向屏幕:
这是旋转版本:
您会注意到,子视图也在上面旋转。因此,只是想知道我的版本与您的版本之间有什么区别(因为我不知道您的代码是什么样的),所以在旋转画布时没有子视图旋转...
关于ios - 在部分UI上支持方向更改,但不是全部,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43012030/