带有视图的 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.tableIBOutlet,那么动画将不起作用。我猜这是新动态故事板的结果。全部在代码中而不是在情节提要中创建元素会导致成功的动画。这就是我需要做的所有事情才能让它工作,在代码中创建UITableView

【讨论】:

如果有人也被这个困扰,那么不要使用 [self.viewToAnimate layoutSubviews];内部动画块,因为它不工作。使用 [self.viewToAnimate layoutIfNeeded];而是。 @Borzh 原来的答案是这样说的? 是的,我只是想强调 layoutIfNeeded 方法是需要的,而不是 layoutSubviews。问题是 layoutSubviews 在 iOS 7.1 上运行,但在 iOS 8+ 上不运行

以上是关于带有视图的 UIView 过渡和设置框架不再适用于 iOS 8的主要内容,如果未能解决你的问题,请参考以下文章

iOS UIView 过渡,容器视图创建问题

是否可以将带有大框架的uiview添加到带有小框架的uiview中

带有切出段和阴影的 UIView

UIView 和 ScrollView 之间的 UIView 过渡翻转

YouTube 嵌入 UIWebViews 不再适用于 iOS

材料迅速:带有搜索栏和标签栏的 UIView 迅速移出视图 3