的iOS 8 - 改变UIScrollView的自动版式与框架启用
我正在更新我的应用程序适用于iOS 8,并增加自动版式约束我的意见。他们大多在工作,但UIScrollView (slideUpScrollView)
给我一些麻烦。里面有一个UIButton (toggleDrawerButton)
来切换SV的帧。在IB中,有限制条件是将SV保持在底部,高度为50pts。当按下切换按钮,它应该改变SV的原点到视图的顶部,模拟抽屉效果。的iOS 8 - 改变UIScrollView的自动版式与框架启用
没有与打开/关闭效果的问题。当我按下toggleDrawerButton,它会产生有时我想,就像在iOS的7(不调用viewDidLayoutSubviews)的影响。其他时候SV会有一个奇怪的效果,其中viewDidLayoutSubviews在我的帧移动后被调用。然后VDLS将尝试重新约束SV并将ToggleDrawerButton重新设置回原来的关闭位置。当打开抽屉时,这会导致视图放回底部。似乎是在toggleDrawerButton按下随机调用VDLS。有时会被调用,其他时间则不会。
我怎样才能正确地重新定位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切换 - 的tableview位置为:{{0,2},{320,452}}
OPEN切换 - 滚动视图位置是:{{0,2},{320, 504}}
OPEN切换 - 切换按钮的位置是:{{128.88730162779191,-6.1126983722080901},{62.225396744416173,62.225396744416173}}
抽屉Posistion是:1个
VDLS帧重新约束日志:
OPEN切换 - 的tableview位置是:{{0,2},{320,452}}
开到ggle - 滚动视图位置是:{{0,2},{320,504}}
OPEN切换 - 切换按钮的位置是:{{128.88730162779191,-6.1126983722080901},{62.225396744416173,62.225396744416173}}
抽屉Posistion是:1
VDLS - toggleButton的位置是:{{0,2},{320,452}}
VDLS - 滚动视图的位置是:{{0,454},{320,50} {128.88730162779191,-6.1126983722080901},{62.225396744416173,62.225396744416173}}
通常,当使用AutoLayout时,您不能手动操作视图的框架。您需要动画约束更改而不是更改框架。
这里是动画约束的信息:如果启用自动版式 https://happyteamlabs.com/blog/ios-how-to-animate-autolayout-constraints/
及结实框架的详细信息: Can I use setFrame and autolayout on the same view?
这使得一切顺利进行。我只需要在代码中编辑适当的约束常量来重新定位它,而不是更改我的ScrollView的框架。 – 2014-09-29 19:11:45
Fyi,链接已移至: https://happyteamlabs.com/blog/ios-how-to-animate-autolayout-constraints/ – 2015-08-08 03:53:01
你得到这个整理出来? – 2014-09-28 02:57:20