I have always put the thing that I'm animating into the animation block:
- (IBAction)animateIt:(id)sender
{
static BOOL small = NO;
small = !small;
CGFloat newWidth = small ? self.view.frame.size.width / 2 :
self.view.frame.size.width;
[UIView animateWithDuration:1 animations:
^{
self.containerWidthConstraint.constant = newWidth;
[self.view layoutIfNeeded];
}];
}
> On Dec 28, 2016, at 4:14 PM, Doug Hill <[email protected]> wrote:
>
> Hi Ken,
>
> I uploaded a sample project here:
>
> https://github.com/djfitz/TestAutolayoutAnimations
>
> I tried to strip this down to what is needed to show the behavior I see.
>
> My code to actually do the animation is this:
>
> - (IBAction)animateIt:(id)sender
> {
> static BOOL small = NO;
>
> if( small )
> {
> [self.view layoutIfNeeded];
>
> self.containerWidthConstraint.constant =
> self.view.frame.size.width;
>
> [UIView animateWithDuration:1 animations:
> ^{
> [self.view layoutIfNeeded];
> }];
> }
> else
> {
> [self.view layoutIfNeeded];
>
> self.containerWidthConstraint.constant =
> self.view.frame.size.width / 2;
>
> [UIView animateWithDuration:1 animations:
> ^{
> [self.view layoutIfNeeded];
> }];
> }
>
> small = !small;
> }
>
> 'container view' has one subview which is a UILabel. The label is pinned to
> the superview edges via autolayout constraints. (e.g. trailing, leading, top,
> bottom edges all pinned to superview edges.)
>
> I tried a few different variations, including leaving out the first
> layoutIfNeeded (which some people say should be done, others not).
>
> The exact behavior is that the label will resize to the new size immediately
> and reflow the text, then the container view will animate it's size change.
> It would be nice if both the label and the container view animate at the same
> time.
> Also, as I mentioned, a button will exhibit the same behavior, probably
> because it has a UILabel inside it to show the button text.
>
> Thanks again for any ideas.
>
> Doug Hill
>
>
>> On Dec 28, 2016, at 12:50 PM, Ken Thomases <[email protected]> wrote:
>>
>> On Dec 28, 2016, at 1:55 PM, Doug Hill <[email protected]> wrote:
>>>
>>> I can now animate my constraint changes but I notice that subviews aren't
>>> animated. For example, I have a single view with a width constraint, and
>>> this view has a label as a subview that expands to the size of it's parent
>>> view via edge constraints.
>>> I can change the width constraint constant of the parent view at runtime
>>> and it animates very well. However, the subviews jump into place
>>> immediately then the parent view animates into place. I see the same
>>> behavior with a button as a subview.
>>
>> Show exactly how you're animating the constraint changes. Are you really
>> animating the change of the constraint or are you doing a layoutIfNeeded
>> within an animation context? Even if the former, are you calling any
>> methods that force layout (layoutIfNeeded or similar)? If so, where/when?
>>
>> Regards,
>> Ken
_______________________________________________
Cocoa-dev mailing list ([email protected])
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com
This email sent to [email protected]