iOS 13 动画视图不改变框架
iOS 13 Animating View Not Changing Frame
我有一个在 iOS 13 模拟器上用 Xcode 10 编译的应用程序。在一个视图中有一个 "tray" 视图,当点击时从底部显示,在 iOS 12 中它完美地工作,在 iOS 13 中,点击正在调用方法,但是更改为帧未保存 - 我在注释中包含了调试器的输出,因此您可以看到帧值的输出是什么;
- (void) userClickActivityTray: (UITapGestureRecognizer *) gestureRecognizer {
if(self.activityTrayShown) {
/*
(lldb) po self.activityTrayContainerView.frame
(origin = (x = 0, y = 792), size = (width = 414, height = 104))
*/
[self hideActivityTray];
} else {
if (!self.activityTrayViewInitialFrameComputed) {
self.activityTrayViewInitialFrameComputed = YES;
self.activityTrayInitialFrame = self.activityTrayContainerView.frame;
}
/*
(lldb) po self.activityTrayContainerView.frame
(origin = (x = 0, y = 638), size = (width = 414, height = 224))
(origin = (x = 0, y = 638), size = (width = 414, height = 224))
(lldb) po self.activityTrayInitialFrame
(origin = (x = 0, y = 792), size = (width = 414, height = 104))
(origin = (x = 0, y = 792), size = (width = 414, height = 104))
(lldb)
*/
[UIView animateWithDuration:0.25 animations:^{
self.activityTrayContainerView.frame = CGRectMake(self.view.bounds.origin.x,
self.bottomView.frame.origin.y - self.activityTrayViewController.maximumHeight,
self.view.bounds.size.width,
self.activityTrayViewController.maximumHeight);
self.activityTrayBackgroundView.alpha = 1.0;
self.bottomView.alpha = self.dotsProgressView.alpha = 0;
} completion:^(BOOL finished) {
self.activityTrayShown = YES;
/*
(lldb) po self.activityTrayContainerView.frame
(origin = (x = 0, y = 557), size = (width = 414, height = 305))
(origin = (x = 0, y = 792), size = (width = 414, height = 104))
*/
}];
}
}
我在移动到 iOS13 时遇到了同样的问题。
在我的例子中,大小限制覆盖了我对框架所做的任何更改,iOS12 不是这种情况。
为了让我的应用程序正常工作,我还必须在 "animateWithDuration" 块之前更新 NSLayoutContraint,以便新的框架坐标与布局约束保持兼容。
希望有帮助
iOS13 中的布局系统不同,我们遇到了同样的问题,在我们的案例中,通过将 layout
从 automatic
切换到 Translates Mask Into Constraints
解决了这个问题。
您可以使用 yourview.layer.frame 而不是 yourview.frame
它对我有用。
仅将 .translatesAutoresizingMaskIntoConstraints 的视图设置为 YES,它对我有用。
希望有帮助
我有一个在 iOS 13 模拟器上用 Xcode 10 编译的应用程序。在一个视图中有一个 "tray" 视图,当点击时从底部显示,在 iOS 12 中它完美地工作,在 iOS 13 中,点击正在调用方法,但是更改为帧未保存 - 我在注释中包含了调试器的输出,因此您可以看到帧值的输出是什么;
- (void) userClickActivityTray: (UITapGestureRecognizer *) gestureRecognizer {
if(self.activityTrayShown) {
/*
(lldb) po self.activityTrayContainerView.frame
(origin = (x = 0, y = 792), size = (width = 414, height = 104))
*/
[self hideActivityTray];
} else {
if (!self.activityTrayViewInitialFrameComputed) {
self.activityTrayViewInitialFrameComputed = YES;
self.activityTrayInitialFrame = self.activityTrayContainerView.frame;
}
/*
(lldb) po self.activityTrayContainerView.frame
(origin = (x = 0, y = 638), size = (width = 414, height = 224))
(origin = (x = 0, y = 638), size = (width = 414, height = 224))
(lldb) po self.activityTrayInitialFrame
(origin = (x = 0, y = 792), size = (width = 414, height = 104))
(origin = (x = 0, y = 792), size = (width = 414, height = 104))
(lldb)
*/
[UIView animateWithDuration:0.25 animations:^{
self.activityTrayContainerView.frame = CGRectMake(self.view.bounds.origin.x,
self.bottomView.frame.origin.y - self.activityTrayViewController.maximumHeight,
self.view.bounds.size.width,
self.activityTrayViewController.maximumHeight);
self.activityTrayBackgroundView.alpha = 1.0;
self.bottomView.alpha = self.dotsProgressView.alpha = 0;
} completion:^(BOOL finished) {
self.activityTrayShown = YES;
/*
(lldb) po self.activityTrayContainerView.frame
(origin = (x = 0, y = 557), size = (width = 414, height = 305))
(origin = (x = 0, y = 792), size = (width = 414, height = 104))
*/
}];
}
}
我在移动到 iOS13 时遇到了同样的问题。 在我的例子中,大小限制覆盖了我对框架所做的任何更改,iOS12 不是这种情况。 为了让我的应用程序正常工作,我还必须在 "animateWithDuration" 块之前更新 NSLayoutContraint,以便新的框架坐标与布局约束保持兼容。 希望有帮助
iOS13 中的布局系统不同,我们遇到了同样的问题,在我们的案例中,通过将 layout
从 automatic
切换到 Translates Mask Into Constraints
解决了这个问题。
您可以使用 yourview.layer.frame 而不是 yourview.frame 它对我有用。
仅将 .translatesAutoresizingMaskIntoConstraints 的视图设置为 YES,它对我有用。 希望有帮助