2017-02-20 13 views
0

У меня есть UIViewController, который содержит subview, который отображает форму волны. Когда нажата кнопка, я пытаюсь получить главный UIView, подвью и панель навигации, чтобы перейти от белого к серому. Я смог изменить основной вид и панель навигации, но не могу понять, как заставить subview изменять форму волны. В настоящее время subview мгновенно меняется на серый, а не на анимацию в синхронизации с другим видом и навигационной панелью.subview цвет фона не оживляющий

//View Controller Code 

UIView.animate(withDuration: 10.0, animations: { 

    self.navigationController?.navigationBar.barTintColor = UIColor(red: 20.00/255, green: 20.00/255, blue: 20.00/255, alpha: 1.00) 
    self.navigationController?.navigationBar.layoutIfNeeded() 
    self.waveform.backgroundColor = UIColor(red: 20.00/255, green: 20.00/255, blue: 20.00/255, alpha: 1.00) 
    self.view.backgroundColor = UIColor(red: 20.00/255, green: 20.00/255, blue: 20.00/255, alpha: 1.00) 

    }, completion: { finished in 

     //do stuff 
}) 

//waveform view 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    self.setup() 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    self.setup() 
} 

override func draw(_ rect: CGRect) { 
    for i in 0..<self.circles.count { 
     self.draw(self.circles[i], ratio: -1.0) 
     self.draw(self.circles[i], ratio: 1.0) 
    } 
} 

func update(_ level: Double) { 

    amplitude = fmin(normalizedPowerLevelFromDecibels(level), maxAmplitude) 
    setNeedsDisplay() 
} 

// ОБНОВЛЕНО анимация

UIView.transition(with: self.view, duration: 1.0, options: [.transitionCrossDissolve], animations: { 

    self.view.backgroundColor = UIColor(red: 20.00/255, green: 20.00/255, blue: 20.00/255, alpha: 1.00) 


    self.navigationController?.navigationBar.barTintColor = UIColor(red: 20.00/255, green: 20.00/255, blue: 20.00/255, alpha: 1.00) 
    self.navigationController?.navigationBar.layoutIfNeeded() 

    self.waveform.backgroundColor = UIColor(red: 20.00/255, green: 20.00/255, blue: 20.00/255, alpha: 1.00) 

}, completion: nil) 

Это приводит к тому, вид сигнала и панель навигации для анимации в синхронизации, но self.view изменения в темно-серый цвет сразу после того, как две другие точки зрения сделаны анимации ...

+0

Невозможно получить представление из вышеприведенного фрагмента кода, можете ли вы поделиться своим проектом с помощью [email protected], тогда я попытаюсь выяснить проблему. – arunjos007

+0

Друг вы устанавливаете начальный цвет? –

+0

Я пробовал ваш код, он отлично работает. Цвета анимируются для всех трех ... –

ответ

0

Моя идея сделать анимацию, как это

Objective-C

//Set Initial frame or color here & then write block for animation 

[UIView animateWithDuration:1.0f animations:^{ 

     // Now set your changing animation frame or color here 

    }completion:^(BOOL finished) { 

     //Do completion stuff here 

    }]; 

Если вы собираетесь установить его anyView.layer.backgroundColor затем #import <QuartzCore/QuartzCore.h>

Swift

//Set Initial frame or color here & then write block for animation 

UIView.animate(withDuration: 5.0, animations: { 

     // Now set your changing animation frame or color here 
     self.view.layer.backgroundColor = UIColor(red: 20.00/255, green: 20.00/255, blue: 20.00/255, alpha: 1.00).cgColor 

}, completion: { finished in 

      //do completion stuffs 
    }) 

Если вы собираетесь установить его anyView.layer.backgroundColor затем import QuartzCore

+0

Пробовал это. К сожалению, это не работает. – Brosef

+0

Я проверил ваш код, он работает, –

+0

мой подзаголовок - это не просто UIview, который я добавил через построитель интерфейсов. его настраиваемый и программно созданный. – Brosef

0

Попробуйте это : -

UIView.animate(withDuration: 1.0, delay: 0.0, options:[.transitionCrossDissolve], animations: { 
     self.view1.backgroundColor = UIColor(red: 20.00/255, green: 20.00/255, blue: 20.00/255, alpha: 1.00) 
     self.view2.backgroundColor = UIColor(red: 20.00/255, green: 20.00/255, blue: 20.00/255, alpha: 1.00) 

     self.view.backgroundColor = UIColor(red: 26.00/255, green: 152.00/255, blue: 143.00/255, alpha: 1.00) 


     self.navigationController?.navigationBar.barTintColor = UIColor(red: 20.00/255, green: 20.00/255, blue: 20.00/255, alpha: 1.00) 
     self.navigationController?.navigationBar.layoutIfNeeded() 
    }, completion:nil) 
+0

Хорошо, этот вид работ. Я сделал некоторые коррективы. Я оставил 'с: self.view' то же самое. При анимации я меняю фоны 'self.view',' self.waveform' и 'self.navigationController? .navigationBar'. Я не использую '.layer'. Теперь навигационная панель и вид осциллограммы оживляются синхронно, но основной вид мгновенно меняется на серый после того, как и форма волны, и панель навигации уже анимированы до серого. – Brosef

+0

Ваш основной вид уже серый? Попробуйте установить другой цвет (может быть белый) перед анимацией, а затем установите цвет фона в серый.Увеличьте время анимации и сделайте все это в viewDidAppear() – ChanWarde

+0

Нет основного вида уже белого. Он становится серым мгновенно, а другие виды оживляют. Делаете анимации в 'ViewDidAppear()'? Зачем? Все это происходит после нажатия кнопки. – Brosef

0

Таким образом, цвет фона с видом волны не может быть анимирован из-за моей реализации drawRect. Мне нужно было установить цвет фона в виде осциллограммы, чтобы очистить его, а затем добавить за ним UIView и анимировать цвет фона этого вида.