2014-09-26 32 views
0

我正在更新我的应用程序适用于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}}

+0

你得到这个整理出来? – 2014-09-28 02:57:20

回答

2

通常,当使用AutoLayout时,您不能手动操作视图的框架。您需要动画约束更改而不是更改框架。

这里是动画约束的信息:如果启用自动版式 https://happyteamlabs.com/blog/ios-how-to-animate-autolayout-constraints/

及结实框架的详细信息: Can I use setFrame and autolayout on the same view?

+1

这使得一切顺利进行。我只需要在代码中编辑适当的约束常量来重新定位它,而不是更改我的ScrollView的框架。 – 2014-09-29 19:11:45

+1

Fyi,链接已移至: https://happyteamlabs.com/blog/ios-how-to-animate-autolayout-constraints/ – 2015-08-08 03:53:01

相关问题