2017-02-08 5 views
0

Нам нужно показать 10 изображений последовательно с определенным интервалом времени (изображения по умолчанию скрыты = да и имеют тег от 1111 до 1120). Результатом кода является появление изображений сразу, без задержек. Анимация выполняется отдельной функцией. В чем может быть проблема? Я использую Xcode 8.2.1Анимация без задержки (UIView animateWithDuration delay)

-(void)doski:(NSInteger)i 
    { 
    [UIView animateWithDuration:1.0 
          delay:5.0 
          options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction 
         animations:^(void) { 
         } 
         completion:^(BOOL finished) { 
          [self.view viewWithTag:(i+1110)].hidden=NO; 
          NSInteger i2=i; 
          i2++; 
          if(i2<11) 
          [self doski:i2]; 
          }]; 
    } 
    ........... 
    //function call 
    [self doski:1]; 

При использовании этой опции, ситуация не изменилась:

-(void)doski:(NSInteger)i 
     { 
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut 
        animations:^(void) { 
        } 
        completion:^(BOOL finished){ 
         [UIView animateWithDuration:2.0 delay:1.0 options: 
          UIViewAnimationOptionCurveEaseIn animations:^{ 
           [self.view viewWithTag:(i+1110)].hidden=NO; 
          } completion:^ (BOOL completed) {NSInteger i2=i; 
           i2++; 
           if(i2<18) 
           [self doski:i2];}]; 
        }]; 
} 

Спасибо.

+0

добавить, если (завершено) в вашем блоке завершения, и вы вызываете [self dosk: 1] вне вашего блока анимации в первом методе. Этот код действительно грязный и вонючий, я бы пошел с UICollecitonView и сделал анимацию. –

ответ

0

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

Чтобы исправить код, вы могли бы попробовать что-то вроде этого, прежде чем ваш призыв к animateWithDuration...

UIView *viewToAnimate = [self.view viewWithTag:(i+1110)] 
viewToAnimate.alpha = 0 
viewToAnimate.hidden = NO 

Затем установите альфа 1 в блоке анимации, как так:

viewToAnimate.alpha = 1 

Вот полный пример, иллюстрирующий проблему с пустым блоком анимации. Вы можете скопировать и вставить его в игровое поле. Это Swift, хотя и не Objective-C

import UIKit 
import PlaygroundSupport 

class MyView : UIView { 

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

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    private func setup() { 
     let view = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) 
     view.backgroundColor = UIColor.red 
     self.addSubview(view) 

     UIView.animate(withDuration: 2, delay: 1, options: [], animations: { 
      // commenting out the following line will 
      // trigger the completion block immediately 
      view.frame = CGRect(x: 300, y: 300, width: 50, height: 50) 
     }, completion: { finished in 
      print("done") 
     }) 
    } 

} 

let view = MyView(frame: CGRect(x: 0, y: 0, width: 400, height: 400)) 
view.backgroundColor = UIColor.black 
PlaygroundPage.current.liveView = view 
0

У вас есть несколько проблем с кодом.

Вы не можете анимировать скрытую собственность вида. Скрытое свойство не является анимированным. Вместо этого вам нужно установить значение alpha равным 0 и анимировать его до 1.0. Это приведет к постепенному исчезновению представления, которое я предполагаю, что вы хотите.

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

Если вы хотите, чтобы виды отображались по одному за раз, вам следует позвонить animateWithDuration:delay:options:animations:completion: с задержкой 0 для первой анимации и задержкой продолжительности первой анимации для второго и т. Д. Это так как первая анимация начнется сразу, вторая анимация начнется, когда закончится первая, и так далее.

Ваш код может выглядеть примерно так:

NSTimeInterval duration = 0.25; 
for (index = 0; x < 10; x++) { 
    UIView *viewToAnimate = arrayOfViewsToAnimate[index]; 

    //For each view, set it's hidden property to false 
    //and it's alpha to zero 
    viewToAninimate.hidden = false; 
    viewToAnimate.alpha = 0.0; 
    [UIView animateWithDuration:duration 
    delay: duration * index 
    options: 0 
    animations:^{ 
     //inside the animation block, set the alpha to 1.0 
     viewToAnimate.alpha = 1.0; 
    } 
    completion: nil 
    ]; 
} 

Этот код предполагает, что вы создали массив arrayOfViewsToAnimate, содержащий мнения, которые вы хотите анимировать. Вы также можете назначить теги в представлениях и найти каждое представление с помощью этого тега в цикле for. В любом случае вам нужно будет адаптировать приведенный выше код к вашим потребностям, а не просто скопировать/вставить его в свою программу.

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