[英]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.