2

cocoacontrols.com に投稿されたカスタム UIButton を実装しました。

http://cocoacontrols.com/platforms/ios/controls/imageless-gradient-buttons

プロジェクトを ARC に変換し、ボタンを設定しました。それらは機能しますが、一度押すと、グラデーションが強調表示されたままになります。

それらを設定するには、ストーリーボードと IBOutlets の両方でクラスを変更し、viewDidLoad で必要なグラデーションを選択しました。

何が問題になる可能性がありますか?

編集:私はそれでより多くの時間を費やしてきましたが、問題はボタンがUITableView上にある場合にのみ発生するようです. UIViewController 上にある場合は正常に動作します

編集 #2 : NSLogs によると、コンテナーが UIViewController の場合、ボタンを押すとグラデーションが通常に戻ります。

2012-05-26 10:53:17.950 GradientButtons[11507:f803] highlighthed
2012-05-26 10:53:18.040 GradientButtons[11507:f803] highlighthed
2012-05-26 10:53:18.140 GradientButtons[11507:f803] Normal

ただし、コンテナーが UTableViewController の場合、ボタンはハイライトされたグラデーションのままです。

2012-05-26 10:55:20.969 GradientButtons[11507:f803] highlighthed
2012-05-26 10:55:21.069 GradientButtons[11507:f803] highlighthed

viewContentMode を確認しましたが、すべてのボタン、UIView および UITableView (Scale to Fill) ですべて同じです。再描画に変更しても動作は変わりません。

4

1 に答える 1

2

通常/強調表示されたグラデーション描画を担当するチェックがあります。

   if (self.state == UIControlStateHighlighted)
        gradient = self.highlightGradient;
    else
        gradient = self.normalGradient;

通常のグラデーションがそこで選択されているかどうかを確認するには、ブレークポイントを設定するか、NSLog を追加する必要があります。そうでない場合、次のステップは drawRect、状態ログを追加して通常の UIButton をオーバーライドすることです。色付きのボタンの代わりにそれを使用して、それがテーブルの標準の UIButton 動作であるかどうかを確認します (たとえば、ボタンをクリックした後もセルを強調表示したままにして、サブビューも強調表示するように強制することができます)。


あなたのログに基づいて、問題を再現して興味深いことがわかりました。強調表示された状態がキャッチされるのは競合状態のようですtouchesEnded(クリックを約 1 秒間押し続けてみてください - 状態は になりますnormal) touchesEnded。理由をさらに調査する必要があります。回避策として、次のコードを使用できます。

-(void) setHighlighted:(BOOL)highlighted
{
    NSLog(@"setHighlighted %@", highlighted ? @"Y": @"N");
    [super setHighlighted:highlighted];
    [self setNeedsDisplay];
}
于 2012-05-25T23:41:51.240 に答える