UIView animateWithDuration不改变UIView的框架

时间:2014-11-10 16:30:12

标签: ios objective-c uiview uiviewanimation

我正在尝试实现一个下拉视图,当用户按下按钮时该下拉视图将向下移动,并且一旦用户按下相同的按钮,该视图将再次上升。我为此目的使用以下代码:

[UIView animateWithDuration:0.25f animations:^{
        self.dropdownView.frame =
        CGRectMake(self.dropdownView.frame.origin.x,
                   self.dropdownView.frame.origin.y+42,
                   self.dropdownView.frame.size.width,
                   self.dropdownView.frame.size.height);
    }
                     completion:^(BOOL finished){
        NSLog(@"%@",self.dropdownView);
    }];

我在这里尝试的是将原点42点向下移动以创建下拉类动画。如果向上移动,我正在使用:

[UIView animateWithDuration:0.25f animations:^{
        self.dropdownView.frame =
        CGRectMake(self.dropdownView.frame.origin.x,
                   self.dropdownView.frame.origin.y-42,
                   self.dropdownView.frame.size.width,
                   self.dropdownView.frame.size.height);
    }
                     completion:^(BOOL finished){
    NSLog(@"%@",self.dropdownView);

    }];

但是,如果我检查日志,则不会更新下拉视图的框架。但是,如果我在具有不同UI元素的另一个VC中使用相同的代码,则此代码工作正常。在这两种情况下,我都在故事板中创建了下拉视图。代码有什么问题,以至于它不起作用?

修改

当我在第一个动画之前记录约束时,日志是:

Constraints: (
"<NSIBPrototypingLayoutConstraint:0x7fcb01797460 'IB auto generated at build time for view with fixed frame' H:|-(0)-[UIImageView:0x7fcb01481970](LTR)   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017c0ac0 'IB auto generated at build time for view with fixed frame' V:|-(0)-[UIImageView:0x7fcb01481970]   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017c0b10 'IB auto generated at build time for view with fixed frame' H:[UIImageView:0x7fcb01481970(320)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017aa360 'IB auto generated at build time for view with fixed frame' V:[UIImageView:0x7fcb01481970(42)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017aa3b0 'IB auto generated at build time for view with fixed frame' H:|-(0)-[UIButton:0x7fcb017e8080](LTR)   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017824e0 'IB auto generated at build time for view with fixed frame' V:|-(3)-[UIButton:0x7fcb017e8080]   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb01782530 'IB auto generated at build time for view with fixed frame' H:[UIButton:0x7fcb017e8080(79)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb0179fe70 'IB auto generated at build time for view with fixed frame' V:[UIButton:0x7fcb017e8080(36)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb0179fec0 'IB auto generated at build time for view with fixed frame' H:|-(82)-[UIButton:0x7fcb01796ea0](LTR)   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb01776490 'IB auto generated at build time for view with fixed frame' V:|-(3)-[UIButton:0x7fcb01796ea0]   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017764e0 'IB auto generated at build time for view with fixed frame' H:[UIButton:0x7fcb01796ea0(79)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017956b0 'IB auto generated at build time for view with fixed frame' V:[UIButton:0x7fcb01796ea0(36)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb01795700 'IB auto generated at build time for view with fixed frame' H:|-(164)-[UIButton:0x7fcb01699f60](LTR)   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb01795860 'IB auto generated at build time for view with fixed frame' V:|-(3)-[UIButton:0x7fcb01699f60]   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017958b0 'IB auto generated at build time for view with fixed frame' H:[UIButton:0x7fcb01699f60(79)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017aef40 'IB auto generated at build time for view with fixed frame' V:[UIButton:0x7fcb01699f60(36)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017aef90 'IB auto generated at build time for view with fixed frame' H:|-(242)-[UIButton:0x7fcb01667610](LTR)   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017b44b0 'IB auto generated at build time for view with fixed frame' V:|-(3)-[UIButton:0x7fcb01667610]   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017b4500 'IB auto generated at build time for view with fixed frame' H:[UIButton:0x7fcb01667610(79)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017bbde0 'IB auto generated at build time for view with fixed frame' V:[UIButton:0x7fcb01667610(36)]>")
动画完成后,

和约束日志是:

Constraints: (
"<NSIBPrototypingLayoutConstraint:0x7fcb01797460 'IB auto generated at build time for view with fixed frame' H:|-(0)-[UIImageView:0x7fcb01481970](LTR)   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017c0ac0 'IB auto generated at build time for view with fixed frame' V:|-(0)-[UIImageView:0x7fcb01481970]   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017c0b10 'IB auto generated at build time for view with fixed frame' H:[UIImageView:0x7fcb01481970(320)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017aa360 'IB auto generated at build time for view with fixed frame' V:[UIImageView:0x7fcb01481970(42)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017aa3b0 'IB auto generated at build time for view with fixed frame' H:|-(0)-[UIButton:0x7fcb017e8080](LTR)   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017824e0 'IB auto generated at build time for view with fixed frame' V:|-(3)-[UIButton:0x7fcb017e8080]   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb01782530 'IB auto generated at build time for view with fixed frame' H:[UIButton:0x7fcb017e8080(79)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb0179fe70 'IB auto generated at build time for view with fixed frame' V:[UIButton:0x7fcb017e8080(36)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb0179fec0 'IB auto generated at build time for view with fixed frame' H:|-(82)-[UIButton:0x7fcb01796ea0](LTR)   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb01776490 'IB auto generated at build time for view with fixed frame' V:|-(3)-[UIButton:0x7fcb01796ea0]   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017764e0 'IB auto generated at build time for view with fixed frame' H:[UIButton:0x7fcb01796ea0(79)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017956b0 'IB auto generated at build time for view with fixed frame' V:[UIButton:0x7fcb01796ea0(36)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb01795700 'IB auto generated at build time for view with fixed frame' H:|-(164)-[UIButton:0x7fcb01699f60](LTR)   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb01795860 'IB auto generated at build time for view with fixed frame' V:|-(3)-[UIButton:0x7fcb01699f60]   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017958b0 'IB auto generated at build time for view with fixed frame' H:[UIButton:0x7fcb01699f60(79)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017aef40 'IB auto generated at build time for view with fixed frame' V:[UIButton:0x7fcb01699f60(36)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017aef90 'IB auto generated at build time for view with fixed frame' H:|-(242)-[UIButton:0x7fcb01667610](LTR)   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017b44b0 'IB auto generated at build time for view with fixed frame' V:|-(3)-[UIButton:0x7fcb01667610]   (Names: '|':UIView:0x7fcb014a16b0 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017b4500 'IB auto generated at build time for view with fixed frame' H:[UIButton:0x7fcb01667610(79)]>",
"<NSIBPrototypingLayoutConstraint:0x7fcb017bbde0 'IB auto generated at build time for view with fixed frame' V:[UIButton:0x7fcb01667610(36)]>")

修改2

这就是我想要实现的目标: 这是动画前的视图。单击箭头按钮后,视图应向下移动,如图所示 This is the view before animation. Once I click the arrow button, the view should move down as shown

这里,安排会议和发布会音乐会是两个按钮,它们是我的dropdownView的子视图。他们在那里,甚至在动画之前,但他们在棕色视图后面,所以他们没有被显示,一旦我按下箭头按钮,他们向下移动并变得可见

Here, the Arrange meeting and Post concert are two buttons which are subview of my dropdownView. They are there, even before the animation but they are behind the brown view, so they were not being shown, once I pressed the arrow button, they moved down and become visible

2 个答案:

答案 0 :(得分:7)

当您使用AutoLayout时,您无法直接更新应用的framecenter

它只是赢了工作。定义框架的约束将覆盖您所做的任何更改,并且它将保持在原来的位置。

对于你的动画,你需要设置像这样的约束......

enter image description here

您可能需要设置左侧空间和右侧空间而不是固定宽度等...

然后需要将顶部约束存储在属性中......

@property (nonatomic, weak) IBOutlet NSLayoutConstraint *topConstraint;

正是这种约束我们可以改变为动画视图的框架。 NSLayoutConstraint可写的唯一部分是constant属性。 (讽刺)

无论如何,你的动画代码将是这样的......

self.topConstraint.constant += 42;

[UIView animateWithDuration:0.25f
                 animations:^{
                     [self.view setNeedsLayout];
                 }
                 completion:^(BOOL finished) {
                     NSLog(@"%@",self.dropdownView);
                 }];

答案 1 :(得分:2)

最后,通过使用@Fogmeister的帮助以及使用原始代码,我做对了。使用代码

self.topConstraint.constant += 42;

[UIView animateWithDuration:0.25f
             animations:^{
                 [self.view setNeedsLayout];
             }
             completion:^(BOOL finished) {
                 NSLog(@"%@",self.dropdownView);
             }];

视图的框架正在更新,但它不是动画(下拉类似的东西),所以我用我的原始代码(导致动画,但在动画结束时,视图)回到初始位置)以获得理想的结果。我的最终代码是:

[UIView animateWithDuration:0.25f
                     animations:^{
                         self.topMarginConstraint.constant += 42;
                         [self.dropdownView setNeedsLayout];

                         self.dropdownView.frame =
                         CGRectMake(self.dropdownView.frame.origin.x,
                                    self.dropdownView.frame.origin.y+42,
                                    self.dropdownView.frame.size.width,
                                    self.dropdownView.frame.size.height);
                     }
                     completion:^(BOOL finished) {
                         NSLog(@"%@",self.dropdownView);
                     }];