在layoutSubviews中旋转视图

时间:2015-06-18 06:10:56

标签: ios swift uiview rotation subclass

背景和目标

目标:我想旋转并翻转eq 'Yes'。 (为什么:查看我的previous question

问题:如果直接在multipleCounty上进行转换,文本布局会因某种未知原因而混乱。

解决方案:UITextView放入UITextView容器中,然后对容器进行转换。

新问题:轮播视图上的自动布局(或任何类型的布局)变为a major headache

建议的解决方案:创建UITextView的子类,作为旋转和翻转的UIView的附加容器。然后,自动布局应该在此自定义视图上工作。

enter image description here

当前问题

当所有内容首次出现时都有效(UIView有黄色背景):

enter image description here

但是当方向发生变化时,会发生以下情况(蓝色是子类化的UIView背景,在IB中设置):

enter image description here

如果我禁用UITextView行,则旋转容器视图(红色)会自行重新定位,即使在方向更改时也是如此:

enter image description here

所以问题必须在于我添加UIView的位置。但是我该怎么做呢?

代码

rotationView.addSubview(textView)

如果我不能让这个工作......

虽然我目前在这里碰壁,但我的下一个计划是覆盖UITextView来进行转换。不过,这不是我的第一选择,因为这样做可能会降低性能。

2 个答案:

答案 0 :(得分:6)

问题中代码的问题似乎是转换不断相互添加。为了解决这个问题,解决方案是每次都重置转换,即将其设置为身份转换。

rotationView.transform = CGAffineTransformIdentity

以下是显示关键部分的部分实现。

import UIKit
@IBDesignable class UIVerticalTextView: UIView {

    var textView = UITextView()
    let rotationView = UIView()

    var underlyingTextView: UITextView {
        get {
            return textView
        }
        set {
            textView = newValue
        }
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect){
        super.init(frame: frame)
        self.setup()
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        self.setup()
    }

    func setup() {

        rotationView.backgroundColor = UIColor.redColor()
        textView.backgroundColor = UIColor.yellowColor()
        self.addSubview(rotationView)
        rotationView.addSubview(textView)

        // could also do this with auto layout constraints
        textView.frame = rotationView.bounds
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        rotationView.transform = CGAffineTransformIdentity // *** key line ***

        rotationView.frame = CGRect(origin: CGPointZero, size: CGSize(width: self.bounds.height, height: self.bounds.width))
        rotationView.transform = translateRotateFlip()
    }

    func translateRotateFlip() -> CGAffineTransform {

        var transform = CGAffineTransformIdentity

        // translate to new center
        transform = CGAffineTransformTranslate(transform, (self.bounds.width / 2)-(self.bounds.height / 2), (self.bounds.height / 2)-(self.bounds.width / 2))
        // rotate counterclockwise around center
        transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2))
        // flip vertically
        transform = CGAffineTransformScale(transform, -1, 1)

        return transform
    }
}

我最近的实施最有可能在this github link中找到。

答案 1 :(得分:2)

在调试模式下检查您的宽度和高度。我猜他们在轮换前后都是一样的。这样就可以获得截图了。

第二件事是你应用转换两次。

你有旋转视图 - >你申请转型 - >你改变手机旋转框架 - >之前的转换仍然适用 - >然后你应用另一个转换。 也许你的答案就在这里。

编辑:

可行的解决方案:

你可以检测到你的女巫取向

 UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

 if(orientation == 0) //Default orientation 
   //UI is in Default (Portrait) -- this is really a just a failsafe. 
 else if(orientation == UIInterfaceOrientationPortrait)
   //Do something if the orientation is in Portrait
 else if(orientation == UIInterfaceOrientationLandscapeLeft)
   // Do something if Left
 else if(orientation == UIInterfaceOrientationLandscapeRight)

然后决定如何处理这个问题。

如果方向是纵向而不是你拍摄

width = self.bound.size.width;
height = self.bound.size.height;

如果不是

height = self.bound.size.width;
width = self.bound.size.height;