带有视图的 UIView 过渡和设置框架不再适用于 iOS 8
Posted
技术标签:
【中文标题】带有视图的 UIView 过渡和设置框架不再适用于 iOS 8【英文标题】:UIView transitionWithView & setting the frame no longer works iOS8 【发布时间】:2014-09-22 09:15:09 【问题描述】:自从更新到 ios8 后,许多动画都停止了工作。似乎无法更改视图的y
位置。在iOS7中没有问题。但是在 iOS8 中,它不会超过原来的y
位置。看起来视图的框架确实在更新,但框架没有被重绘。这是我的代码
[UIView transitionWithView:self.view duration:0.3 options:UIViewAnimationOptionCurveEaseInOut animations:^
self.table.frame = CGRectMake(0, (self.view.bounds.size.height - self.button.frame.size.height) - (252), self.view.bounds.size.width, self.table.frame.size.height);
completion:nil];
我也在动画块之外尝试过这段代码;
self.table.frame = CGRectMake(0, (self.view.bounds.size.height - self.button.frame.size.height) - (252), self.view.bounds.size.width, self.table.frame.size.height);
【问题讨论】:
【参考方案1】:更新解决方案是调整自动布局约束而不是frames
原点。单击您要调整的自动布局约束(在界面构建器中,例如顶部约束)。接下来将其设为IBOutlet
;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint;
然后对其进行动画处理;
self.topConstraint.constant = -100;
[self.viewToAnimate setNeedsUpdateConstraints];
[UIView animateWithDuration:.3 animations:^
[self.viewToAnimate layoutIfNeeded];
];
上面的代码将移动视图/或向上移动约束。要将其移回原来的位置,只需调用即可;
self.topConstraint.constant = 0;
[self.viewToAnimate setNeedsUpdateConstraints];
[UIView animateWithDuration:.3 animations:^
[self.viewToAnimate layoutIfNeeded];
];
第二个解决方案
我找到了解决方案。看来,如果self.table
是IBOutlet
,那么动画将不起作用。我猜这是新动态故事板的结果。全部在代码中而不是在情节提要中创建元素会导致成功的动画。这就是我需要做的所有事情才能让它工作,在代码中创建UITableView
。
【讨论】:
如果有人也被这个困扰,那么不要使用 [self.viewToAnimate layoutSubviews];内部动画块,因为它不工作。使用 [self.viewToAnimate layoutIfNeeded];而是。 @Borzh 原来的答案是这样说的? 是的,我只是想强调 layoutIfNeeded 方法是需要的,而不是 layoutSubviews。问题是 layoutSubviews 在 iOS 7.1 上运行,但在 iOS 8+ 上不运行以上是关于带有视图的 UIView 过渡和设置框架不再适用于 iOS 8的主要内容,如果未能解决你的问题,请参考以下文章
是否可以将带有大框架的uiview添加到带有小框架的uiview中
UIView 和 ScrollView 之间的 UIView 过渡翻转