gpt4 book ai didi

iOS 8 - 在启用 AutoLayout 的情况下更改 UIScrollView 的框架

转载 作者:行者123 更新时间:2023-11-28 21:57:29 25 4
gpt4 key购买 nike

我正在为 iOS 8 更新我的应用程序并为我的所有 View 添加自动布局约束。它们大部分都在工作,但 UIScrollView (slideUpScrollView) 给我带来了一些麻烦。其中有一个 UIButton (toggleDrawerButton) 用于切换 SV 的框架。在 IB 中,有限制将 SV 保持在底部,高度为 50pts。当按下 toggleButton 时,它应该将 SV 的原点更改为 View 的顶部,模拟抽屉效果。

打开/关闭效果有问题。当我按下 toggleDrawerButton 时,它有时会产生我想要的效果,就像在 iOS 7 中一样(不调用 viewDidLayoutSubviews)。其他时候,SV 会产生奇怪的效果,即在我的框架移动后调用 viewDidLayoutSubviews。然后 VDLS 将尝试重新约束 SV 和 toggleDrawerButton 回到它原来的关闭位置。这会导致在应该打开抽屉时将 View 放回底部。 VDLS 似乎是在按下 toggleDrawerButton 时随机调用的。有时它会被调用,有时它不会。

如何在不重新约束自动布局的情况下正确地重新定位 SV 的框架以向顶部移动?另外,为什么 VDLS 有时只在按下 toggleDrawerButton 时调用?行为不一致,这使得找到解决方案变得更加困难。

这是 toggleDrawerButton 的 Action 代码:

- (void) toggleAddEditDrawer {
if (self.drawerToggle == 0) { // Open the Drawer
self.drawerToggle = 1;

self.itemNameTextField.text = nil;
self.quantityTextField.text = nil;

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.4];
[UIView setAnimationDelay:0.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

//Rotate the button and make the SV frame slide up

self.toggleDrawerButton.transform = CGAffineTransformMakeRotation(M_PI/4);
self.slideUpScrollView.frame = CGRectMake(0, self.tableView.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
self.slideUpScrollView.contentSize = self.slideUpScrollView.frame.size;


[UIView commitAnimations];
[self.itemNameTextField becomeFirstResponder];

NSLog(@"OPEN Toggle - tableview location is: %@",NSStringFromCGRect(self.tableView.frame));
NSLog(@"OPEN Toggle - scrollview location is: %@",NSStringFromCGRect(self.slideUpScrollView.frame));
NSLog(@"OPEN Toggle - toggleButton location is: %@",NSStringFromCGRect(self.toggleDrawerButton.frame));


} else { //Close the Drawer
self.drawerToggle = 0;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.4];
[UIView setAnimationDelay:0.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

//Reverse the rotation and make the SV frame slide down
self.toggleDrawerButton.transform = CGAffineTransformMakeRotation(0);
self.slideUpScrollView.frame = CGRectMake(0, self.tableView.frame.origin.y + self.tableView.frame.size.height, self.view.frame.size.width, 50);
self.slideUpScrollView.contentSize = self.slideUpScrollView.frame.size;

[UIView commitAnimations];
[self.view endEditing:YES];

NSLog(@"CLOSE Toggle - tableview location is: %@",NSStringFromCGRect(self.tableView.frame));
NSLog(@"CLOSE Toggle - scrollview location is: %@",NSStringFromCGRect(self.slideUpScrollView.frame));
NSLog(@"CLOSE Toggle - toggleButton location is: %@",NSStringFromCGRect(self.toggleDrawerButton.frame));


}
NSLog(@"Drawer Posistion is: %d",self.drawerToggle);

编辑:这是一些控制台日志。

工作帧动画日志:
OPEN Toggle - tableview 位置是:{{0, 2}, {320, 452}}
打开切换 - ScrollView 位置为:{{0, 2}, {320, 504}}
OPEN Toggle - toggleButton 位置是:{{128.88730162779191, -6.1126983722080901}, {62.225396744416173, 62.225396744416173}}
抽屉位置是:1

VDLS帧重约束日志:
OPEN Toggle - tableview 位置是:{{0, 2}, {320, 452}}
打开切换 - ScrollView 位置为:{{0, 2}, {320, 504}}
OPEN Toggle - toggleButton 位置是:{{128.88730162779191, -6.1126983722080901}, {62.225396744416173, 62.225396744416173}}
抽屉位置是:1
VDLS - 表格 View 位置为:{{0, 2}, {320, 452}}
VDLS - ScrollView 位置为:{{0, 454}, {320, 50}}
VDLS - toggleButton 位置是:{{128.88730162779191, -6.1126983722080901}, {62.225396744416173, 62.225396744416173}}

最佳答案

一般情况下,当使用自动布局时,您不能手动操作 View 的框架。您需要为约束变化而不是帧变化设置动画。

这里是关于动画约束的信息: https://happyteamlabs.com/blog/ios-how-to-animate-autolayout-constraints/

以及有关在启用 AutoLayout 时设置框架的更多信息: Can I use setFrame and autolayout on the same view?

关于iOS 8 - 在启用 AutoLayout 的情况下更改 UIScrollView 的框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26064881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com