2015-06-13 3 views
9

Проблема заключается в программном переводе «InfoView» (UIView) в Swift.Как перемещать UIView программно в Swift

следующие ограничения существуют в раскадровке (фото):

enter image description here

Теперь я хотел бы, чтобы переместить «InfoView» внутри «MyView» вверх или вниз.

Я пробовал:

@IBOutlet weak var infoTextLabel: UILabel! 
@IBOutlet weak var infoTextLabelView: UIView! 

// set infoTextLabel color 
self.infoTextLabel.textColor = UIColor.blackColor() 
// set infoTextLabel text 
self.infoTextLabel.text = "hello" 
// unhide infoTextLabel 
self.infoTextLabel.hidden = false 

// For the moving in Y-direction, I tried this - but does not work !!!!!!! 
self.infoTextLabelView.frame.origin.y += 200 

Могли Autolayout-ограничения играют роль. Как преодолеть это программно. Или это метод frame.origin.y неправильный?

Оцените справку по этому вопросу!

+0

Вы пытаетесь создать анимацию или вы просто пытаетесь переместить положение изображения ж/о последовательности анимации? – Jeffrey

+0

Нет необходимости в анимации! – iKK

ответ

18

При использовании ограничений вы никогда не хотите напрямую устанавливать рамку представления. Вместо этого переконфигурируйте ограничения и дайте автомастеру настроить фрейм вашего представления для вас. Создайте IBOutlet в своем контроллере просмотра, чтобы сохранить ссылку на «Ограничение выравнивания по центру Y». Убедитесь, что вы подключили его в раскадровке или xib.

@IBOutlet var yConstraint: NSLayoutConstraint 

Тогда вы можете установить постоянное свойство ограничения, чтобы компенсировать его с позиции Y (положительное число будет двигаться вниз, отрицательный перемещает его вверх).

yConstraint.constant = 200 

Это переведет ваш взгляд на 200 пунктов вниз.

+0

Отлично! Спасибо! –

9

Смотрите мой ответ на этот другой вопрос о хорошем способе программно перемещать взгляды с помощью автоматической компоновки: https://stackoverflow.com/a/30687856/3149796

Кроме того, в зависимости от эффекта вы собираетесь для и других требований вашего пользовательского интерфейса, вы можете также достичь это с преобразованиями, не нарушая ваш автоматический макет.

// Create a new transform 
self.infoTextLabelView.transform = CGAffineTransformMakeTranslation(0.0, 200.0) 

// Or modify existing transform 
self.infoTextLabelView.transform = CGAffineTransformTranslate(self.infoTextLabelView.transform, 0.0, 200.0 ) 
2

Swift 4

UIView.animateKeyframes(withDuration: 0.25, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: 7), animations: { 
     self.infoTextLabelView.frame.origin.y+=200 

},completion: nil) 
Смежные вопросы