2015-05-21 3 views
1

У меня есть вид, который должен двигаться вверх, как ящик со дна экрана. Но это ничего не значит. Он просто сидит там =) Может кто-нибудь скажет мне, почему это так?View is an animate

Это мой код:

import UIKit 

class InfoPopUpVC: UIViewController { 
    var superView: UIView! 
    var labelText: String! 
    let textLabel = UILabel() 
    let height = CGFloat(80) 


    override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    UIView.animateWithDuration(0.4, animations: {() -> Void in 
     self.view.center.y = 50 
    }) 
    } 

override func viewDidLoad() { 
    super.viewDidLoad() 
    setupTextLabel() 
    view.frame = CGRectMake(0, superView.frame.maxY-height, superView.frame.width, height) 
    AnimationHelper.blurBackgroundForView(view) 
    view.backgroundColor = .greenColor() 
    } 

func setupTextLabel(){ 
    textLabel.text = labelText 
    textLabel.frame = CGRectMake(0, 0, view.frame.width, view.frame.height) 
    textLabel.numberOfLines = 3 
    textLabel.textAlignment = .Center 

    textLabel.frame.inset(dx: 10, dy: 8) 
    textLabel.sizeToFit() 
    textLabel.font = UIFont(name: "HelveticaNeue-Light", size: 17) 
    textLabel.textColor = .whiteColor() 
    view.addSubview(textLabel) 
    } 
} 
+0

Вы используете автозапуск? Если это так, меняющиеся центры и рамки не будут перемещать представления. – Jack

+0

InfoPopUpVC называется программным, когда я хочу, чтобы PopUp снизу отображал некоторую информацию. ViewController PopUp добавлен, поскольку subview использует autolayout, но поскольку он называется программным способом, я не могу установить никаких ограничений. – gutenmorgenuhu

+1

Неверно, что программные ограничения невозможно установить. Существует полный набор API-интерфейсов для добавления ограничений программным образом и множество литературы, описывающей, как это сделать. Прочитайте ссылку на NSLayoutConstraint в Xcode для введения (в частности, раздел о создании ограничений.) –

ответ

0

Вы не можете анимировать рамку или подобное свойство, если UIView ограничивается использованием autolayout.

У вас есть два варианта:

  1. избавиться от autolayout и анимировать Директории Frames
  2. Используйте autolayout и анимации ограничений (например, через выходы)

Смотрите следующие ссылки на примеры :

How do I animate constraint-changes

IOS: ANIMATING AUTOLAYOUT CONSTRAINTS

1

Попробуйте поместить ваш код, как следовать в viewDidAppear или viewWillAppear и отправку асинхронный. В противном случае анимация может не работать.

override func viewDidAppear(animated: Bool) { 
dispatch_async(dispatch_get_main_queue(), { 
      UIView.animateWithDuration(0.4, animations: {() -> Void in 
     self.view.center.y = 50 
    }) 
     }) 
} 
+0

Это не имеет никакого смысла. –

+0

это имеет смысл, к сожалению, когда представление инициализировано, основная очередь заблокирована и ваша анимация может не выполняться, в основном с асинхронной отправкой в ​​основной очереди, убедитесь, что анимация анимации. Также он пытается вызвать анимацию, которая будет отображаться, поскольку вид еще не появился, вы можете увидеть анимацию после появления представлений, что означает, что ее нужно вызвать в viewDidAppear, вам может не понадобиться отправка async, но в некоторых случаях case, необходимо разместить анимацию в асинхронном режиме отправки в основной очереди. – KeranMarinov

+0

Еще одна вещь - viewDidLayoutSubviews(), которая вызывается после функции viewDidAppear, она сбрасывает значения по умолчанию (ограничения раскадровки) на все виды внутри вашего основного вида вашего контроллера представлений, это также может быть еще одной причиной, по которой анимация не работает. – KeranMarinov