gpt4 book ai didi

ios - viewWillTransitionToSize 导致非旋转 View Controller 调整大小和重新定位

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:57:10 27 4
gpt4 key购买 nike

很多人都讨论过模仿原生 iOS 相机应用程序的技术(其中 UI 元素随着设备旋转而原地旋转)。其实我之前问过一个问题here .大多数人让您锁定 UI 的方向,然后仅对您想要旋转的元素强制进行转换。这可行,但元素不会随着您在 native iOS 应用程序中看到的流畅动画而旋转,这会导致一些问题。具体来说,我的部分界面允许用户在不离开此界面的情况下进行共享,但是当共享 View 旋转时,它会偏离中心。所以我想找到一种不同的方法来做到这一点。

我找到了指向 Apple's AVCam 的链接样本,这让我从这里开始。我是新手,但我已经设法将它从 Obj-C 转换为 Swift。以下是我目前使用的关键元素:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in

//Code here performs animations during the rotation

let deltaTransform: CGAffineTransform = coordinator.targetTransform()
let deltaAngle: CGFloat = atan2(deltaTransform.b, deltaTransform.a)
var currentRotation: CGFloat = self.nonRotatingView.layer.valueForKeyPath("transform.rotation.z") as! CGFloat

// Adding a small value to the rotation angle forces the animation to occur in a the desired direction, preventing an issue where the view would appear to rotate 2PI radians during a rotation from LandscapeRight -> LandscapeLeft.
currentRotation += -1 * deltaAngle + 0.0001;
self.nonRotatingView.layer.setValue(currentRotation, forKeyPath: "transform.rotation.z")

}, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
print("rotation completed");
// Code here will execute after the rotation has finished
// Integralize the transform to undo the extra 0.0001 added to the rotation angle.
var currentTransform: CGAffineTransform = self.nonRotatingView.transform
currentTransform.a = round(currentTransform.a)
currentTransform.b = round(currentTransform.b)
currentTransform.c = round(currentTransform.c)
currentTransform.d = round(currentTransform.d)
self.nonRotatingView.transform = currentTransform
})

super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

然后我有单独的 View Controller ,用于在相反方向上执行相同转换的图标。图标现在实际上正确地旋转(具有流畅的动画和一切)并且相机预览保持正确的方向。

问题是,当我将设备从纵向旋转到横向或反之时,非旋转 View 会调整大小并且所有内容都会错位。我该如何解决?

最佳答案

我让它工作了(虽然它花了我比它应该有的更多的时间)。我需要将非旋转 View 的宽度和高度参数设置为在构建时删除,然后将以下内容添加到 viewDidLoad():

let nonRotatingWidth = nonRotatingView.widthAnchor.constraintEqualToConstant(UIScreen.mainScreen().bounds.width)
let nonRotatingHeight = nonRotatingView.heightAnchor.constraintEqualToConstant(UIScreen.mainScreen().bounds.height)
nonRotatingView.addConstraints([nonRotatingWidth, nonRotatingHeight])

这里使用了新的 Swift 2 约束语法,相对简洁易读。

我还尝试仅使用新的约束语法(不进行转换)通过 updateViewConstraints() 实现相同类型的界面(参见 my question about it here)。我相信这种方法是创建此类界面的一种更简洁的方法,但我还无法使其在运行时不崩溃的情况下工作。

关于ios - viewWillTransitionToSize 导致非旋转 View Controller 调整大小和重新定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33132977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com