Применяйте и анимируйте множество ограничений для коллекции uiviews - PullRequest
2 голосов
/ 07 апреля 2020

У меня есть розетка с коллекцией этикеток. Метки находятся в представлениях стека, заключенных в представление стека. Когда представление загружается, я бы хотел, чтобы каждая метка постепенно исчезала и двигалась вправо одна за другой. Я могу применить ограничение в al oop, чтобы сместить его. Но только один из них вернется к конечной позиции.

-(void)viewDidLoad {
[super viewDidLoad];
for (UILabel *lbl in _constructionlabels) {
    lbl.alpha = 0.0;
    leadingCnst=[NSLayoutConstraint
    constraintWithItem:lbl
    attribute:NSLayoutAttributeLeading
    relatedBy:NSLayoutRelationEqual
    toItem:[lbl superview]
    attribute:NSLayoutAttributeLeading
    multiplier:1.0
    constant:-25];
    [self.view addConstraint:leadingCnst];
}

}

-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];

leadingCnst.constant = 0;
[UIView animateWithDuration:0.33 delay:2 options:UIViewAnimationOptionCurveEaseOut animations:^{
    for (UILabel *lbl in self->_constructionlabels) {
        lbl.alpha = 1.0;
    }
    [self.view layoutIfNeeded];
} completion:^(BOOL finished) {
}];

}

Как я могу применить ограничения к каждому нужному ярлыку, а затем анимировать все они один за другим?

Ответы [ 2 ]

3 голосов
/ 07 мая 2020

Сохраняйте ссылки на каждое ограничение метки и запускайте сразу все анимации, каждая с задержкой.

// Declare array to hold references to constraints
NSMutableArray* _labelConstraints = [NSMutableArray array];

-(void) viewDidLoad {
    [super viewDidLoad];
    for (UILabel * lbl in _constructionlabels) {
        lbl.alpha = 0.0;

        NSLayoutConstraint* leadingCnst = [NSLayoutConstraint
            constraintWithItem: lbl
            attribute: NSLayoutAttributeLeading
            relatedBy: NSLayoutRelationEqual
            toItem: [lbl superview]
            attribute: NSLayoutAttributeLeading
            multiplier: 1.0
            constant: -25
        ];
        [self.view addConstraint: leadingCnst];

        // Add constraint reference
        [_labelConstraints addObject: @(leadingCnst)];
    }
}

-(void) viewDidAppear: (BOOL) animated {
    [super viewDidAppear: animated];

    for (i = 0; i < [_constructionlabels count]; i++) {

        // Get label
        Label* lbl = [_constructionlabels objectAtIndex:i];        

        // Get constraint
        NSLayoutConstraint* labelConstraint = [_labelConstraints objectAtIndex:i];      

        // Animate
        [UIView animateWithDuration: 0.33 delay: i options: UIViewAnimationOptionCurveEaseOut animations: ^ {
                lbl.alpha = 1.0;
                labelConstraint.constant = 0;
                [self.view layoutIfNeeded];
            }
            completion: ^ (BOOL finished) {}
        ];  
    }
}

Примечание. Это просто подтверждение концепции - возможно, вы захотите изменить код.

(Прошло много времени с того момента, как я написал Obj C, если вы сообщите мне о любых ошибках, я исправлю их.)

0 голосов
/ 05 мая 2020

Вам понадобится поставить рекурсивную функцию для анимации каждого ярлыка по одному без для l oop. Добавьте блок завершения в анимации.

    func animate(_ label: UILabel, completion: @escaping () -> Void) {
        UIView.animate(withDuration: 1, animations: {
            // add animation here
        }, completion: { _ in
            completion()
        })
    }

    let labelCollection = [UILabel]()
    var index = 0

    func startAnimation() {
        animate(labelCollection[index], completion: {
            if self.index < self.labelCollection.count - 1 {
                self.index = self.index + 1
                self.startAnimation()
            }
        })
    }
...