chromium/ios/chrome/browser/shared/ui/util/property_animator_group.h

// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_BROWSER_SHARED_UI_UTIL_PROPERTY_ANIMATOR_GROUP_H_
#define IOS_CHROME_BROWSER_SHARED_UI_UTIL_PROPERTY_ANIMATOR_GROUP_H_

#import <UIKit/UIKit.h>

// A group of UIViewPropertyAnimators, which can be run (and stopped) together.
// This class is functionally convenience wrappers around the
// UIViewImplicitlyAnimating API that will map those method calls to all of the
// animators in a group. Since instances of this class conform to that protocol,
// in most cases an animator group can be used where a single property animator
// would be (provided that the call sites want a id<UIViewImplicitlyAnimating>).
// Protocol methods that mutate the receiver are sequentially appiled to all of
// the animators in the group (this include -startAnimation, -stopAnimation:,
// and so on). -addAnimations:, -addCompletion:, and similar methods are just
// applied to the first animator in the group. Methods (and property getters)
// that return a value return the value of the first animator in the group, on
// the assumption that all of them have the same value.
// It is assumed that all of the animators in the group have the same duration
// and delay. This is enforced by -addAnimator:
@interface PropertyAnimatorGroup : NSObject <UIViewImplicitlyAnimating>

// The animators in this group.
@property(nonatomic, readonly) NSArray<UIViewPropertyAnimator*>* animators;

// Adds `animator`, checking that it matches duration and delay with the other
// animators in the group.
- (void)addAnimator:(UIViewPropertyAnimator*)animator;

@end

#endif  // IOS_CHROME_BROWSER_SHARED_UI_UTIL_PROPERTY_ANIMATOR_GROUP_H_