2

ボタンの幅のサイズ変更をアニメーション化するのに問題があります。これは私のコードです:

- (IBAction)profileButtonPressed:(UIButton *)sender {
    UIImage *buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)];
    [sender setBackgroundImage:buttonProfileDefault forState:UIControlStateNormal];

    UIImage *buttonProfileDefaultDown = [[UIImage imageNamed:@"Profile_Button_Default_Down"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)];
    [sender setBackgroundImage:buttonProfileDefaultDown forState:UIControlStateHighlighted];

    [sender setTitle:@"LOG OUT" forState:UIControlStateNormal];

    sender.titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    sender.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    // Animate
    CGRect originalFrame = sender.frame;
    originalFrame.size.width = sender.frame.size.width+60;
    [UIView animateWithDuration:1.5 animations:^{
        sender.frame = originalFrame;
    }];
}

ボタンの幅は変更されますが (タイトルを変更するコードを削除しない限り)、アニメーション化することはできません。

何が間違っているのでしょうか?

アップデート

そのため、幅の変更をアニメーション化することができましたが、setTitle をアニメーション セクションに配置しましたが、テキスト自体の適切な幅が得られません (下の画像)。どうすればこれを実現できますか?

ここに画像の説明を入力

解決

そのため、uibutton をプログラムで配置することになりました。自動レイアウトが問題を引き起こしているようです。

それは私だけですか、それとも Objective C では多くのことが不器用ですか?!

4

4 に答える 4

2

あなたの問題は、本質的なコンテンツのサイズに関係していると思われます。それが設定されている場合(デフォルトではそうです)、タイトルを変更すると、コードで何もしなくても、アニメーションなしでボタンのサイズが変更されます。これを修正するには、いくつかの方法があります。最も簡単なのは、IB のボタンのサイズを少し拡大することだと思います。IB に明示的な幅を設定させるには、1 ピクセルでも十分なはずです (または、自分で設定することもできます)。次に、コードでこれを行うことができます。

-(IBAction)buttonClick:(UIButton *)sender {
    [sender setTitle:@"Log Out Immediately" forState:UIControlStateNormal];
    [self.button removeConstraint:self.lengthConstraint];
    [UIView animateWithDuration:.5 animations:^{
        self.button.frame = CGRectMake(self.button.frame.origin.x, self.button.frame.origin.y, 250, 44);
    }];
}

self.lengthConstraint は、IB で設定された長さ制約への IBOutlet です。

それを行う別の方法は、NSTimer を使用して制約メソッドの定数を変更することです。これは、WWDC 2012 の講演「自動レイアウトをマスターするためのベスト プラクティス」で言及されている方法の 1 つです。

-(IBAction)buttonClick:(UIButton *)sender {
    [sender setTitle:@"Log Out Immediately" forState:UIControlStateNormal];
    [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(expandButton:) userInfo:nil repeats:YES];
}

-(void)expandButton:(NSTimer *) timer {
    self.lengthConstraint.constant += 2;
    if (self.lengthConstraint.constant > 170) [timer invalidate];
}
于 2012-11-27T05:40:53.827 に答える
0

setTitleアニメーション化する前に削除し、完了ブロックで実行します。

    CGRect originalFrame = sender.frame;
    originalFrame.size.width = sender.frame.size.width+60;

    [UIView animateWithDuration:1.5 delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^{
        sender.frame = originalFrame;
    } completion:^{
        [sender setTitle:@"LOG OUT" forState:UIControlStateNormal];
    }];

更新: 自動レイアウト機能を使用しているかどうかを確認してください。よくわかりませんが、ここで問題になるはずです。プログラムでボタンを作成するときにコメントで述べたように、これは私にとってはうまくいきます。

于 2012-11-27T00:38:42.507 に答える
0

解決

そのため、uibutton をプログラムで配置することになりました。自動レイアウトが問題を引き起こしているようです。

それは私だけですか、それとも Objective C では多くのことが不器用ですか?!

于 2012-12-20T21:36:23.670 に答える
0

自動レイアウトの使用を開始したら、フレームの変更をやめ、代わりにビューの制約値を変更する必要があります。

ボタンの幅の制約に を追加して、その値IBOutletを変更できます。constant

于 2015-09-30T15:40:02.737 に答える