1

我试图制作一个自定义视图,其中一个元素(UILabel)具有动画,当点击自定义视图的按钮时,标签应该展开然后收缩。动画的第一部分正确发生,但第二部分不正确。我正在使用这种方法。

[UIView animateWithDuration:1.3 animations:^{
    CGRect frame = CGRectMake(50, 15, 140, 20);
    [labelFav setFrame:frame];
} completion:^(BOOL finished) {
    //[labelFav setHidden:YES];
    [UIView animateWithDuration:1.3 animations:^{
        CGRect frame = CGRectMake(50, 15, 0, 20);
        [labelFav setFrame:frame];
    }];

}];

我认为 Refresh 和 LayoutSubviews 方法的实现方式存在问题。我是按照本教程完成的,ray wenderlinch

问题是在调用第一个动画之后调用 LayoutSubviews ,因此所有项目都设置为初始位置,当第一个动画完成时,第二个动画开始但项目设置为原始状态,所以我相信动画没有发生,因为动画之间发生了变化。

我想知道如何正确执行此操作,您能帮帮我吗?

谢谢。

PS:这是关于同一问题但角度不同的第二个问题。我之前的问题

[更新]

这是我的 LayoutSubviews 代码:

- (void)layoutSubviews {
[super layoutSubviews];

if(_idEvent == 0) return;

_buttonFav = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
[_buttonFav setImage:[UIImage imageNamed:@"fav.png"] forState:UIControlStateNormal];
[_buttonFav addTarget:self action:@selector(pressedFavButton:) forControlEvents:UIControlEventTouchDown];

_labelButton = [[UILabel alloc]initWithFrame:CGRectMake(0, 45, 0, 20)];
_labelButton.text = @"LABEL";

[self addSubview:_labelButton];
[self addSubview:_buttonFav];

}

在第二个动画之前调用。我的刷新方法是:

- (void)refresh {
if(selected){

    [_buttonFav setImage:[UIImage imageNamed:@"fav_sel.png"] forState:UIControlStateNormal];
}
else{
    [_buttonFav setImage:[UIImage imageNamed:@"fav.png"] forState:UIControlStateNormal];
}

}

我只是根据让我知道按钮是否被点击的属性来设置按钮的图像。

4

3 回答 3

1

使用 SetTransform 和 CGAffineTransform

试试这个

[UIView animateWithDuration:1.3 animations:^{

    [labelFav setTransform:CGAffineTransformMakeScale(0.5,0.5)];
} completion:^(BOOL finished) {

    [UIView animateWithDuration:1.3 animations:^{

        [labelFav setTransform:CGAffineTransformMakeScale(1.0,1.0)];
    }];

}];
于 2013-10-14T12:19:32.600 回答
1

我愿意,那么如何使用自动布局制作动画呢?使用新的 XCode,您没有禁用它的选项。

向标签添加宽度约束。然后IBOutlet在你的实现文件中创建这个约束(如果你不知道怎么做,请参见这里的第 3 节),让我们这样说:

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

然后你可以这样动画它:

[UIView animateWithDuration:1.3 animations:^{
    self.buttonWidthConstraint.constant = 140;
    [self.view layoutIfNeeded];
} completion:^(BOOL finished) {

    [UIView animateWithDuration:1.3 animations:^{
        self.buttonWidthConstraint.constant = 0;
        [self.view layoutIfNeeded];
    }];

}];
于 2013-10-14T13:15:28.590 回答
0

尝试将 UILabel 封装到 UIView 中并为该视图设置动画。

UIView *auxView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 100.0)];
[auxView addSubview:labelFav];
[UIView animateWithDuration:1.3 animations:^{
    CGRect frame = CGRectMake(50, 15, 140, 20);
    [auxView setFrame:frame];
} completion:^(BOOL finished) {
    //[labelFav setHidden:YES];
        [UIView animateWithDuration:1.3 animations:^{
            CGRect frame = CGRectMake(50, 15, 10, 20);
            [auxView setFrame:frame];
        }];
}];
于 2013-10-14T12:23:15.640 回答