2015-06-09 2 views
1

Я только начал разработку iOS и изучаю Swift и Xcode. У меня есть объект UIImageView в контроллере представления и вы хотите переместить этот UIImageView по экрану, пока он переключается между двумя изображениями. Вот код:UIImageView анимация продолжительностью вместе с анимационными образами

@IBOutlet weak var anImageView: UIImageView! 

@IBAction func beginAnimation(sender: AnyObject) { 

    let imgListArray:[AnyObject] = [UIImage(named: "img1.png")!, UIImage(named: "img2.png")!] 
    anImageView.animationImages = imgListArray 
    anImageView.animationDuration = 0.5 
    anImageView.image = UIImage(named: "img1.png") 
    anImageView.startAnimating() 

    UIView.animateWithDuration(4.0, animations: { 
     self.anImageView.center = CGPoint(x: 600, y: 600) 
     }, completion: {finished in 
      self.anImageView.center = CGPoint(x:80,y:80)}) 
} 

Проблема с координатами. UIImageView запускается за пределы экрана и не заканчивается на (80,80). Переключение в порядке.

Я думаю, мне нужно преобразовать координаты в пространство супервизора (?), Но мои попытки сделать это не были успешными. Например, я попробовал функцию конвертации, но не был успешным.

Любые рекомендации приветствуются!

Спасибо.

+0

Вы используете ограничения для позиционирования изображения сначала? Если это так, вам нужно отрегулировать ограничения, а не местоположение фрейма, а затем изменить изменение ограничения, поместив '[self.view layoutIfNeeded]' в блок анимации. –

+0

Спасибо, Рори. Да, были отмечены опции автоматического макета и размера. Я их не контролировал, и поведение было таким, как ожидалось. С наилучшими пожеланиями. –

+0

Я думаю, что вы только что отложили проблему, отключив ограничения. Лучше обнять их, которых я нашел, или будущее будет полон для вас. В вашем случае принцип тот же, просто используйте ограничения вместо прямого управления кадрами и измените значения ограничений. Вы можете добавить ограничения как IBOutlets, чтобы вы могли легко изменять их значения в коде. –

ответ

1

Вы не указали ясно, что вы хотите делать, поэтому давайте сосредоточимся на том, что этот код делает сделать:

UIView.animateWithDuration(4.0, animations: { 
    self.anImageView.center = CGPoint(x: 600, y: 600) 
}, completion: {finished in 
    self.anImageView.center = CGPoint(x:80,y:80) 
}) 

Этот код говорит:

  1. Независимо от того, где теперь вы начинаете просмотр изображения с этой точки в сторону (600 600) (что, если вы не на iPad, будет вне экрана).

  2. Когда оно доберется, сделайте это прыжок от (600,600) до (80,80).

Это то, что вы говорите. Так что если это не то, что вы хотите, не говорите об этом!

+0

Да, я работаю над iPad-приложением. Опять же, это всего лишь тестовый код, чтобы сделать перемещение UIImageView, переключаясь через массив изображений и заставляя его делать что-то при завершении анимации. UIImageView позиционируется в контроллере просмотра в (80,80) в начале. –

+0

Хорошо, поэтому я ожидаю, что он медленно переместится от (80,80) до (600 600), а затем вернется обратно (80,80). Но вы не ясно сказали, как то, что вы видите, отличается от этого. Конечно, здесь есть много других вещей - размер изображения (помните, что эти координаты - это _center_ изображения), его режим содержимого, независимо от того, разместили ли вы его с помощью автоматической компоновки и т. Д. – matt

+0

Спасибо, Мэтт , Это была проблема автоматического макета. После того, как эта опция была снята, наряду с классами размера, поведение ожидалось. Приветствия. –

0

Отмена автоматической настройки макета разрешила проблему на данный момент. Но правильный подход заключается в том, чтобы оставить автоматическую компоновку и ограничения на анимацию. Выгрузите решение, как только я его получу.

+0

Хорошо, но это неправильное решение.Вы не решаете проблему; вы поворачиваетесь спиной к нему. Вам нужно использовать автоматическую компоновку. Правильный подход заключается в том, чтобы научиться делать анимацию при наличии автоматического макета - например, анимированные ограничения вместо анимирования позиции или временно удалить это представление из автоматического макета, а затем снова вернуть его. – matt

+0

Спасибо. Я, конечно, узнаю больше об автоматическом макете и анимированных ограничениях. Я отредактировал ответ, чтобы отразить это. –

+1

Почему бы не удалить ваш вопрос и не начать снова или изменить свой вопрос, чтобы вместо того, чтобы махать руками, вы спрашиваете, как правильно выполнить эту позиционную анимацию? Еще лучше, найдите Stack Overflow и не задавайте никаких вопросов; тема о том, как оживить при наличии автомакета, здесь обсуждалась. – matt

Смежные вопросы