我正在更新适用于iOS 8的应用程序,并向所有视图添加了AutoLayout约束。他们大部分都在工作,但是UIScrollView (slideUpScrollView)
给我带来了一些麻烦。内部有一个UIButton (toggleDrawerButton)
可以切换SV的帧。在IB中,有一些限制将SV保持在底部,高度为50pts。按下toggleButton时,应该将SV的原点更改为视图顶部,从而模拟抽屉效果。
打开/关闭效果有问题。当我按下toggleDrawerButton时,有时会产生我想要的效果,就像在iOS 7中一样(不调用viewDidLayoutSubviews)。有时,SV在帧移动后调用viewDidLayoutSubviews会产生奇怪的效果。然后,VDLS将尝试将SV重新限制,并将toggleDrawerButton返回其原始关闭位置。当打开抽屉时,这会将视图放回底部。 VDLS似乎在toggleDrawerButton按下时被随机调用。有时它会被调用,而其他时候则不会。
如何在不自动布局重新约束的情况下正确地重新定位SV的框架,使其移向顶部?另外,为什么有时仅在按下toggleDrawerButton时才调用VDLS?行为不一致,这使得寻找解决方案变得更加困难。
这是toggleDrawerButton的动作代码:
- (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-表格视图位置为:{{0,2},{320,452}}
OPEN Toggle-滚动视图位置为:{{0,2},{320,504}}
OPEN Toggle-toggleButton的位置为:{{128.88730162779191,-6.1126983722080901},{62.225396744416173,62.225396744416173}}
抽屉中毒为:1
VDLS帧重新约束日志:
OPEN Toggle-表格视图位置为:{{0,2},{320,452}}
OPEN Toggle-滚动视图位置为:{{0,2},{320,504}}
OPEN Toggle-toggleButton的位置为:{{128.88730162779191,-6.1126983722080901},{62.225396744416173,62.225396744416173}}
抽屉中毒为:1
VDLS-表格视图位置为:{{0,2},{320,452}}
VDLS-滚动视图位置为:{{0,454},{320,50}}
VDLS-toggleButton的位置为:{{128.88730162779191,-6.1126983722080901},{62.225396744416173,62.225396744416173}}
最佳答案
通常,使用自动版式时,您无法手动操作视图的框架。您需要设置约束更改而不是框架更改的动画。
这是有关设置约束动画的信息:
https://happyteamlabs.com/blog/ios-how-to-animate-autolayout-constraints/
有关启用自动版式时设置框架的更多信息:
Can I use setFrame and autolayout on the same view?