簡體   English   中英

如何以編程方式為自定義UIButton設置突出顯示動畫?

[英]How to programmatically set highlight animation for custom UIButton?

我有一個非常復雜的邏輯,必須使用以下命令觸發UIButton的事件:

if (CGRectContainsPoint(self.startButton.frame, point))
{
    [self buttonDidClicked:self.startButton];
}

它沒有鏈接到任何控制事件,因此沒有必要。 問題在於調用該函數時沒有高光動畫。 我說的是常規動畫,當單擊它時,會有一個簡短的黑色蒙版應用於UIButton。

然后,我嘗試將按鈕鏈接到UIEventTouchDown控件事件並通過以下方式觸發調用:

if (CGRectContainsPoint(self.startButton.frame, point))
{
    [self.nextButton setHighlighted:YES];
    [self.backButton sendActionsForControlEvents:UIControlEventTouchDown];
}

模擬真實的觸摸事件。 它確實在按鈕上形成了一個黑色層,但不會自動熄滅。

最好的方法是什么? 觸發按鈕后,我想獲得一些反饋。 默認動畫就足夠了。

您可以按以下方式使用圖層或漸變圖層:

- (void) viewDidLoad
{
        [super viewDidLoad];

        CAGradientLayer *gradient = [CAGradientLayer layer];
        loginButton.clipsToBounds = YES;
        UIColor *topColor = [UIColor colorWithRed:255/255 green:255/255 blue:255/255 alpha:0.9];
        UIColor *middleColor = [UIColor colorWithRed:61.0/255 green:130.0/255 blue:244.0/255 alpha:1.0];
        UIColor *bottomColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
        gradient.colors = [NSArray arrayWithObjects:(id)topColor.CGColor,
                           (id)middleColor.CGColor, (id)bottomColor.CGColor, nil];
        gradient.locations = [NSArray arrayWithObjects:
                              [NSNumber numberWithFloat:0.0f],
                              [NSNumber numberWithFloat:0.05f],
                              [NSNumber numberWithFloat:0.7],
                              nil];
        gradient.frame = [[loginButton layer] bounds];
        gradient.cornerRadius = 4.0;
        gradient.borderWidth = 0.5;
        [loginButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [loginButton.layer insertSublayer:gradient atIndex:0]; 
        [loginButton addTarget:self action:@selector(loginTouchDown:)
                forControlEvents:UIControlEventTouchDown];
        [loginButton addTarget:self action:@selector(loginTouchUp:)
              forControlEvents:UIControlEventTouchUpOutside];
}

- (IBAction)loginTouchDown:(id)sender
{
        CAGradientLayer *gradient = [loginButton.layer.sublayers objectAtIndex:0];
        UIColor *topColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
        UIColor *middleColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
        UIColor *bottomColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
        gradient.colors = [NSArray arrayWithObjects:(id)topColor.CGColor, (id)middleColor.CGColor,
                           (id)bottomColor.CGColor, nil];
}

- (IBAction)loginTouchUp:(id)sender
{
        CAGradientLayer *gradient = [loginButton.layer.sublayers objectAtIndex:0];
        UIColor *topColor = [UIColor colorWithRed:255/255 green:255/255 blue:255/255 alpha:0.9];
        UIColor *middleColor = [UIColor colorWithRed:61.0/255 green:130.0/255 blue:244.0/255 alpha:1.0];
        UIColor *bottomColor = [UIColor colorWithRed:24.0/255 green:77.0/255 blue:214.0/255 alpha:1.0];
        gradient.colors = [NSArray arrayWithObjects:(id)topColor.CGColor,
                           (id)middleColor.CGColor, (id)bottomColor.CGColor, nil];
}

- (IBAction)loginButton:(id)sender
{
        [self loginTouchUp:sender];
        [self doLogin];
}

登錄按鈕在故事板上定義,並分配給本地視圖屬性。

(在* .h文件中)

@interface LoginViewController : UIViewController <UITextFieldDelegate>

@property (nonatomic, retain) IBOutlet UIButton *loginButton;
@end

(在* .m文件中)

@synthesize loginButton;

在viewdidload中,我們為正常狀態和推送狀態定義了漸變層。 然后我們在上/下事件上操縱它們。 我們還需要loginButton()作為按鈕處理程序來執行操作。 這樣,此按鈕行為在理想情況下與普通按鈕相同。 好像是這樣。

您可以在iphone應用商店中找到其工作方式示例。 有一個免費的應用程序稱為Torchoo。 當您運行它時,它首先顯示的是登錄屏幕。 它具有登錄按鈕。 按下它,看這是否是您需要的。 此代碼來自該項目。

方法是將-buttonDidClicked操作綁定到UIButton UIControlEventTouchUpInside事件:

[self.startButton addTarget:self action:@selector(buttonDidClicked:) forControlEvents:UIControlEventTouchUpInside];

如果需要使用CGRectContainsPoint()機制,則應在-buttonDidClicked調用之前將self.startButton.highlighted選項設置為YES,然后將其設置為NO。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM