【问题标题】:viewDidLoad UIView with CGPoint()viewDidLoad UIView 与 CGPoint()
【发布时间】:2015-04-01 23:30:55
【问题描述】:

我想创建自己的自定义 segue 动画,在该动画中,我想让呈现的 VC 从 button.origin 以 size(1,1) 出现并转移到 CGPoint(0,0) 并拉伸到全屏尺寸。

VC1 转到 VC2 并通过 VC1 的 button.frame 传递

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let PVC = segue.destinationViewController as VC2
    PVC.CGstart = button.frame.origin}

VC2我有

@IBOutlet var VC4: UIView!

var CGstart = CGPoint()

override func viewDidLoad() {
    super.viewDidLoad()
    VC4.frame.origin = CGstart
}

@IBAction func DragTest(sender: UIButton) {
    VC4.frame.origin = CGstart
    println(CGstart)
}

viewDidLoad 不调整 VC4 的 frame.origin....而我的 @IBAction func DragTest 可以

这是为什么?我尝试了很多不同的变化。

【问题讨论】:

    标签: ios iphone swift uiview viewdidload


    【解决方案1】:

    尝试将原点设置移动到viewWillAppear

    override func viewWillAppear() {
        super.viewWillAppear()
        VC4.frame.origin = CGstart
    }
    

    【讨论】:

    • 没有任何改变
    • 也许您启用了自动布局,并且它正在根据约束将其移回。如果你把它放在viewDidAppear 中,它可以工作吗?
    • 将其放入 viewDidAppear 会导致 VC4 加载并显示然后移动到 CGstart 这几乎违背了动画的目的。
    • 那么显示的是,您在布局期间应用了自动约束,这会将其移动到默认位置。 viewDidLoad 有效,因为这是后期布局。我认为这里的解决方案是覆盖 layoutSubViews。在这里调用 super.layoutSubViews 然后设置 CGstart。
    • 唯一的选项是override func layoutSublayersOfLayer(layer: CALayer!),即使把它放在这里也不会改变它是默认加载然后移动的。
    【解决方案2】:

    这解决了问题。

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.layoutIfNeeded()
        VC4.frame.origin = CGstart
    }
    

    不需要viewDidAppearlayoutSubviews

    【讨论】:

    • 如果有任何事情导致布局发生在 viewDidLoad 之后,您可能会发现这很可能会导致问题。
    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多