我正在更新适用于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?

10-08 05:57