旋转的视图是否与自动布局兼容?

时间:2015-06-15 08:56:25

标签: ios rotation autolayout

我学会了如何使用仿射变换旋转视图(请参阅here)。我还了解了自动布局(请参阅herehere),甚至是程序化自动布局(请参阅herehere)。但是,我不知道如何让自动布局与旋转视图一起使用。

此图显示了我想要做的事情:

enter image description here

我认为问题来自宽度和高度因旋转而变化。有没有办法让旋转视图填充它的超视图?是否有一些技巧可以使自动布局工作或旋转后它是不兼容的?

(我只学过Swift,但如果你更熟悉的话,我会很高兴通过Objective-C答案。)

更新

按照@ VinayJain的建议,我做了以下事情:

  • 将子视图边缘固定到故事板中的超级视图。
  • created IBOutlets了解子视图各边的间距约束。

    @IBOutlet weak var rightSpace: NSLayoutConstraint!
    @IBOutlet weak var leftSpace: NSLayoutConstraint!
    @IBOutlet weak var topSpace: NSLayoutConstraint!
    @IBOutlet weak var bottomSpace: NSLayoutConstraint!
    
  • 旋转了子视图

    subview.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2))
    
  • 更改了网点的约束

    self.rightSpace.constant = CGFloat(0)
    self.leftSpace.constant = CGFloat(0)
    self.topSpace.constant = CGFloat(0)
    self.bottomSpace.constant = CGFloat(0)
    

但正是在这一点上我意识到我并不需要改变间距值。我希望间距保持为0.我只需要它来调整自己。然而,旋转混乱了。效果如下图所示:

enter image description here

2 个答案:

答案 0 :(得分:1)

当我尝试通过HDMI / AirPlay将外部视频从iOS运行到旋转的电视屏幕时遇到了这个问题。

有时候,电视会设置为将信号“旋转” 90度或180度等,但是通常情况下,它没有该选项。

使用这样的“包装”视图,我可以强制外部屏幕上的视图控制器旋转其内容,而内容实际上并不知道有什么不同。

let contentsView = SomeWildCustomViewUsingAutoLayoutEtc()
let wrapper = RotatingWrapperView(contentsView)
wrapper.translatesAutoresizingMaskIntoConstraints = false
parentView.addSubview(wrapper)
// ...
wrapper.rotation = .upsideDown

RotatingWrapperView的来源:https://github.com/quantcon/UIKit/blob/master/AutoLayoutRotationDemo/Views/RotatingWrapperView.swift

答案 1 :(得分:-2)

您可以轻松地使用自动布局执行此操作,

  • 通过将边缘固定到superview来创建约束
  • 为这些限制创建出口(比如leftSpace,rightSpace,topSpace,bottomSpace)

  • 检查轮换,并相应更新这些值

使用此选项检查轮换:Check Rotation