【问题标题】:Use Autolayout and CGAffineTransform使用自动布局和 CGAffineTransform
【发布时间】:2015-12-27 13:02:53
【问题描述】:

我在使用自动布局和旋转时遇到问题。 在我的应用程序中,我有一个轮子,上面有几个视图需要旋转以适应圆圈(可以平移、可滚动)。

黑色方块是MenuView 的背景,其中包含一个UILabel、两个UIImageViews 和三个UIButtons。全部由约束固定,在XIB 文件中指定。

一切正常,直到我将视图旋转到 0、90、180、270 以外的其他值...其中MenuView 的所有内容都得到一个 x 偏移量。

我不知道如何摆脱这种偏移。也许它与translatesAutoresizingMaskIntoConstraints 有关,但我无法弄清楚在正确视图上正确使用它。希望有人能帮我解决这个问题。

代码

//Menu View Holder
let menuViewHolder = UIView(frame: self.bounds)
self.addSubview(menuViewHolder)
viewHolders.append(menuViewHolder)

//Menu View
let menuView = self.addView(MenuView.self, fromNib: "MenuView")
menuView.colorSet = UIColorSet.getDefaultSet()
menuView.translatesAutoresizingMaskIntoConstraints = true
menuViewHolder.addSubview(menuView)
views.append(menuView)

//Frame
let screenWidth:CGFloat = 320.0
let width:CGFloat = screenWidth
let height:CGFloat = 300.0
menuView.frame = CGRect(x: (self.bounds.width-width)/2.0, y: 0.0, width: width, height: height)

//Rotation
let angle = CGFloat(menuViewIndex)*CGFloat(viewAngle);
//menuViewHolder.transform = CGAffineTransformMakeRotation(angle + CGFloat(M_PI/2.0))
menuViewHolder.layer.transform = CATransform3DMakeRotation(angle + CGFloat(M_PI/2.0), 0, 0, 1)

视觉

【问题讨论】:

  • 我不确定您到底希望发生什么,应该在哪里显示什么?通常,自动布局会完全忽略变换,它们在完全不同的级别上运行。
  • 好吧,因为MenuView 中的所有标签和按钮都设置为保持在其范围内,我假设它们在旋转后也保持在其范围内。正如您在图像中看到的那样,30° 和 60° 的情况并非如此
  • 。您正在转换 CoreGraphics layer,这与 UIKit 或布局无关 - 它根本不关心它。
  • 但它是如何做到的。或者这个偏移量应该从哪里来?以及为什么它也应该工作 90°。我没有触摸标签和按钮框架或位置。正如你所看到的那样,包含所有这些的视图框架非常好。
  • 只是为了演示(因为我现在必须走了):如果您有两个相同大小的正方形彼此叠放并且旋转顶部的正方形,则其角将始终位于除非您旋转 90、180 或 270 度,否则较低的正方形。

标签: ios swift rotation autolayout transform


【解决方案1】:

好吧,我有点修好了。

我在我的UIViewControllerviewDidLoad 中设置了所有帧、旋转和添加子视图。 当我在viewDidAppear 中旋转时,一切正常。一个接一个地设置帧和在代码中旋转会相互影响,这有点奇怪。在等待视图完全设置时(通过viewDidAppear 完成)修复了这些问题。

【讨论】:

    猜你喜欢
    • 2015-11-28
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多