2014-10-29 152 views
1

在我的应用程序中,我使用的是UIView,其中包含UITableView,ButtonsLabels。它使用Storyboard创建。当用户单击一个导航栏按钮UIView将出现从顶部到一定高度的动画,如果他们再次点击它,它会用动画隐藏UIView(从该高度到顶部)。 和UIActionView相同。动画UIView无法正常工作

如果UITableView中没有记录,它可以正常工作。但如果它有任何记录,在调用[self hideBasket]时,UIView会从视图底部出现到顶部(未隐藏)。

//隐藏篮码

-(void)hideBasket{ 
    /*Finished Hiding the Basket 
    [self.view sendSubviewToBack:_shoppingCartView]; 
    [_shoppingCartView setHidden:YES]; 
    _isShoppingCartSeen = NO;*/ 

    CGRect basketFrame = _shoppingCartView.frame; 
    basketFrame.origin.y = -basketFrame.size.height; 

    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ 
     _shoppingCartView.frame = basketFrame; 
    } completion:^(BOOL finished) { 
     // Finished Hiding the Basket 
     //[self.view sendSubviewToBack:_shoppingCartView]; 
     // [_shoppingCartView setHidden:YES]; 
     _isShoppingCartSeen = NO; 
}]; 

//显示篮码

-(void)showBasket{ 

    /*[self.view bringSubviewToFront:_shoppingCartView]; 
    [_shoppingCartView setHidden:NO]; 
    _isShoppingCartSeen = YES;*/ 

    CGRect basketFrame = _shoppingCartView.frame; 
    basketFrame.origin.y = 0; 

    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ 
     _shoppingCartView.frame = basketFrame; 
    } completion:^(BOOL finished) { 
     // Finished Showing the Basket 
     [self.view bringSubviewToFront:_shoppingCartView]; 
     [_shoppingCartView setHidden:NO]; 
     _isShoppingCartSeen = YES; 
    }]; 
} 

我做错的是什么?

+0

是否在故事板上选择了AutoLayout? – 2014-10-29 15:04:29

+0

@JimTierney是的,它是 – GoCrazy 2014-10-29 15:20:49

回答

4

使用自动布局,您应该动画您的约束,而不是更改对象的框架。

我嘲笑起来从哪里开始使用约束粗糙的例子,这应该解决您的问题

首先,你需要设置

每个对象都必须有你的篮子视图的限制至少要设置4个约束才能正确设置。

查看下面的屏幕快照,按下我选择的视图底部的约束图标来设置视图的宽度和高度以及左侧距离约束。

然后,您需要将空间设置为超级视图顶部,请参阅第二个屏幕截图。

enter image description here

约束设置到上海华顶

enter image description here

一旦你的约束已经建立您设置CTRL拖动顶部空间,上海华财产像你的头文件下面的截图。 (你需要在视图中设定的限制,以适应你的表客体等也是如此),

enter image description here

现在,这已经成立,请通过以下方式代替你的代码,它应该工作细

-(void)hideBasket{ 

self.topVerticalSpaceConstraint.constant = -312; 

[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ 

    [self.view layoutIfNeeded]; 

} completion:^(BOOL finished) { 

}]; 

}

- (无效)showBasket {

self.topVerticalSpaceConstraint.constant = 0; 

    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ 
     [self.view layoutIfNeeded]; 

    } completion:^(BOOL finished) { 

    }]; 

}

请注意,我只需将一定量的人工这里的虚拟视图的大小我做了,但你当然会改变这是您的视图的大小等

请记住,您的每个视图/对象应理想地设置其约束,尤其是下拉视图中的UITableview。在UIView中设置表格的高度,宽度和顶部和左侧空间约束就足够了。

如果你希望你的观点,从第一负载被隐藏,你的viewDidLoad中设置约束-valueOfHeightOfBasket

我希望这有助于。

+0

+1非常感谢您的时间和精力来复制它。我会尝试你的建议并会回复给你。 – GoCrazy 2014-10-29 16:51:01

+0

完美工作顺利。谢谢 – GoCrazy 2014-10-30 12:36:22

+0

辉煌,非常感谢。 – 2015-11-02 13:05:31