2016-11-24 9 views
3

Я хочу, чтобы скопировать эту анимацию в моем проектесжиматься ширину кнопки с выпуском анимации

enter image description here

Так что я сделал попытку это:

  1. Для преобразования масштаба X .. но проблема заключается также в сокращении названия кнопки.

    self.transform = CGAffineTransform.identity 
    UIView.animate(withDuration: duration, delay: delayTime, 
           usingSpringWithDamping: 0.7, 
           initialSpringVelocity: 0.7, 
           options: [.curveEaseIn], 
           animations: { 
           self.transform = CGAffineTransform(scaleX: 0.5, y: 1.0) 
        }, completion: nil) 
    

    Это то, что она дает (название кнопки также сжимается)

    enter image description here

  2. Использование CASpringAnimation

    let shrinkAnim = CASpringAnimation(keyPath: "bounds.size.width") 
    shrinkAnim.damping = 0.7 
    shrinkAnim.initialVelocity = 0.7 
    shrinkAnim.fromValue = frame.width 
    shrinkAnim.toValue = width 
    shrinkAnim.dura[![enter image description here][3]][3]tion = duration 
    shrinkAnim.timingFunction = getTimingFunction(curve: curve) 
    shrinkAnim.fillMode = kCAFillModeForwards 
    shrinkAnim.isRemovedOnCompletion = false 
    layer.add(shrinkAnim, forKey: shrinkAnim.keyPath) 
    

    Таким образом, можно изменить ширину, но и позиция title enter image description here

Так что мой вопрос: что происходит не так, или что мне нужно добавить, чтобы воспроизвести первое изображение?

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

+0

Я думаю, что когда мы анимируем представления, мы должны удалить ограничения и установить кадры по коду. –

+0

@RajanMaheshwari это ??? Я действительно не думаю, что так .. может быть, вы правы, но я не уверен, что нам нужно удалить ограничения для анимации. –

ответ

0

Не используйте CGAffineTransform, а взять и выход NSLayoutConstraint атрибут кнопки width и изменить его constant внутри анимации блока/закрытия.

UIView.animate(withDuration: duration, delay: delayTime, 
      usingSpringWithDamping: 0.7, 
      initialSpringVelocity: 0.7, 
      options: [.curveEaseIn], 
      animations: { 
      self.buttonWidthConstraint.constant = desired_width_here 
}, completion: nil) 
+0

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

+0

hmm..i agree ... –

+0

Тогда вы можете просто использовать левое ограничение и правое ограничение и увеличить их внутри блока UIView.animate –

0

Вы пробовали обжалуние содержимого и сопротивление сжатию. Не могли бы вы попытаться сделать это по наивысшему приоритету. enter image description here

+0

попробовал ... не работает –

+0

Еще один способ, который вы можете попробовать, отрегулировав шрифт во время сокращения. button.titleLabel.adjustsFontSizeToFitWidth = true – Ballu

0

Применить преобразование на рамке кнопки. Когда вы масштабируете UIView в анимации, он не учитывает subviews/layout, он будет просто равномерно масштабировать все, что делается.

self.transform = CGAffineTransform.identity 
UIView.animate(withDuration: duration, delay: delayTime, 
       usingSpringWithDamping: 0.7, 
       initialSpringVelocity: 0.7, 
       options: [.curveEaseIn], 
       animations: { 
       self.frame = CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>) 
    }, completion: nil) 
+0

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

+0

Если вы хотите сделать это с помощью auto layouts, тогда не используйте левые, прямые ограничения обхода. Использовать self.width равно super.width пропорционально. Затем измените это ограничение ширины ширины как часть его первоначального размера в анимации. – Windindi

1

Поместите кнопку внутри UIView

ваш взгляд дерево будет выглядеть как этот

SuperView> UIView> Кнопка

Делая это, вы теперь фиксированный размер ширины вашей кнопки может следовать, что является uiview

Это будет выглядеть так

View in a superview

Button Constraints

Left ContraintRight Constraint

А затем анимировать с помощью

//let's say the current left and right constraint are 8 

leftConstraint.constant = 50 
rightConstraint.constant = 50 
UIView.animate ... { 
    self.view.layoutIfNeeded() 
} 

С помощью этого вам нужно только установить фрейм UIView к нужной рамке и имеют кнопку следуйте примеру костюма, и ваши анимации просто будут установлены пропорционально тому, как вы его кодировали.

+1

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

+0

Исправьте свой вопрос, потому что из-за этого утверждения я думал, что вы используете NSLayoutConstraints ** «Мои ограничения для кнопки закреплены на левом, правом и нижнем краях и фиксируют высоту». ** goodluck хотя :) –