2017-01-19 3 views
0

Я хочу, чтобы UIView отображался путем масштабирования слева направо, если я нажму кнопку. Если я снова нажму кнопку, вид должен масштабироваться справа налево.Как масштабировать UIView слева направо и назад?

Я нашел объяснение, как это сделать влево-вправо, но даже это решение работает только один раз. Если я скрою вид и снова воспроизведу анимацию, он снова масштабирует его из центра. Также масштабирование его справа налево не работает, так как оно исчезает безмерно без какой-либо анимации.

Вот мой код до сих пор:

if(!addQuestionaryView.isHidden) 
    { 
     //Reset input if view is hidden 
     addQuestionaryInput.text = "" 
     self.addQuestionaryView.isHidden = false 
     let frame = addQuestionaryView.frame; 
     let rect = CGRect(x: frame.origin.x, y: frame.origin.y, width: frame.width, height: frame.height) 
     let leftCenter = CGPoint(x: rect.minX, y: rect.minY) 
     addQuestionaryView.layer.anchorPoint = CGPoint(x:1,y: 0.5) 
     addQuestionaryView.layer.position = leftCenter 
     UIView.animate(withDuration: 0.6, 
         animations: { 
         self.addQuestionaryView.transform = CGAffineTransform(scaleX: 0, y: 1) 
     }, 
         completion: { _ in 
         self.addQuestionaryView.isHidden = true 
     }) 
    } 
    else 
    { 
     self.addQuestionaryView.isHidden = false 
     let frame = addQuestionaryView.frame; 
     let rect = CGRect(x: frame.origin.x, y: frame.origin.y, width: frame.width, height: frame.height) 
     let leftCenter = CGPoint(x: rect.minX, y: rect.midY) 
     addQuestionaryView.layer.anchorPoint = CGPoint(x:0,y: 0.5); 
     addQuestionaryView.layer.position = leftCenter 
     addQuestionaryView.transform = CGAffineTransform(scaleX: 0, y: 1) 
     UIView.animate(withDuration: 0.6, 
         animations: { 
         self.addQuestionaryView.transform = CGAffineTransform(scaleX: 1, y: 1) 
     }, 
         completion: nil) 
    } 

Как сказал появляясь часть работает один раз, а затем снова начинается от центра. Исчезающая часть не работает вообще.

+0

Вы хотите его на самом деле масштаб (squish view) - или вы просто хотите, чтобы он появился слева, а затем исчез вправо? –

+0

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

ответ

1

Я не знаю, что «масштабировать его, чтобы он имеет немного выглядеть Android показывают анимацию» означает (и я надеюсь, что я никогда не; Я никогда не видел Android-телефон, я никогда не надеюсь увидеть его).

Но вы имеете в виду что-то вроде этого? Это делается с помощью анимации маски перед зрения, обнаруживая таким образом, а затем пряча его:

enter image description here

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

class MyMask : UIView { 
    override func draw(_ rect: CGRect) { 
     let r = CGRect(x: 0, y: 0, width: rect.width/2.0, height: rect.height) 
     UIColor.black.setFill() 
     UIGraphicsGetCurrentContext()?.fill(r) 
    } 
} 

class ViewController: UIViewController { 

    @IBOutlet weak var lab: UILabel! 
    var labMaskOrigin = CGPoint.zero 

    var didAddMask = false 
    override func viewDidLayoutSubviews() { 
     if didAddMask {return} 
     didAddMask = true 
     let mask = MyMask() 
     mask.isOpaque = false 
     let w = self.lab.bounds.width 
     let h = self.lab.bounds.height 
     mask.frame = CGRect(x: -w, y: 0, width: w*2, height: h) 
     self.lab.mask = mask 
     self.labMaskOrigin = mask.frame.origin 
    } 

    var labVisible = false 
    func toggleLabVisibility() { 
     labVisible = !labVisible 
     UIView.animate(withDuration: 5) { 
      self.lab.mask!.frame.origin = self.labVisible ? 
       .zero : self.labMaskOrigin 
     } 
    } 
} 
+0

Да, это именно то, что я имею в виду. Спасибо, возможно, это дает мне правильное направление, что искать. –

+0

Подождите, я отправлю код. – matt

+0

Спасибо! Это было прекрасно. –

0

Удалить это:

addQuestionaryView.layer.anchorPoint = CGPoint(x:0,y: 0.5); 
    addQuestionaryView.layer.position = leftCenter 
    addQuestionaryView.transform = CGAffineTransform(scaleX: 0, y: 1) 

Затем в одушевленных с длительностью блока используйте приведенный ниже код вместо CGAfflineTransform

addQuestionaryView.frame = CGRect(0,0,500,100) 

Заменить 500 ширина любой ширине вы хотите быть.

Ans, чтобы закрыть его обратно сделать это:

addQuestionaryView.frame = CGRect(0,0,0,100); 
+0

Но будет ли это не просто перемещать представление вместо масштабирования? –

+0

Извините, я прочитал ваш вопрос неправильно, дайте мне знать, если это работает, и извините за поздний ответ. – Timmy

+0

Я также пробовал ваше решение. Я думаю, что это, как правило, работает, так как мое решение для матов лучше работает, поскольку оно уже заботится о подзонах. (Я не упоминал, что subviews должны быть анимированы вместе, извините). При таком подходе мне пришлось бы анимировать подразделы отдельно. Также как-то задняя анимация не срабатывала. Он ждал, пока не пройдет время, а затем называет блок завершения, но анимация никогда не показывалась. Но это, скорее всего, связано с моим проектом. В любом случае, спасибо! –

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