2013-01-11 65 views
0

我有,我有觸發事件的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]; 
} 

它模擬真實的觸摸事件。它確實在按鈕上形成黑色圖層,但不會自動關閉。

這樣做的最佳方法是什麼?我想在按鈕被觸發時得到一些反饋。默認動畫就足夠了。

+1

爲什麼不設置[self.nextButton setHighlighted:NO];延遲0.5秒後? –

回答

0

要走的路就是你的-buttonDidClicked行動綁定到UIButton的UIControlEventTouchUpInside事件:

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

如果你需要使用CGRectContainsPoint()機制應該經過前-buttonDidClicked調用設置self.startButton.highlighted選項設置爲YES,然後爲NO 。

+0

我無法綁定,因爲存在盜取所有事件的另一個視圖。 – SmallChess

+0

好的,然後嘗試打開和關閉.highlighted選項。 –

1

您可以使用層或梯度層在這樣的方式:

- (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中我們定義用於正常狀態梯度層和按下的狀態。然後我們在up/down事件中操作它們。我們還需要loginButton()作爲按鈕處理程序來執行操作。這種方式這個按鈕的行爲理想情況下與普通按鈕相同。似乎是這樣。

它是如何工作的例子,你可以在iPhone應用商店中找到。有一個名爲Torchoo的免費應用程序。當你運行它時,它顯示的第一件事就是登錄屏幕。它有登錄按鈕。按它看看這是否是你需要的。該代碼來自該項目。

+0

這不是答案,其評論 –

+0

是的...對不起,讓我添加更多:) –

+0

完成(編輯我的味精) –

相關問題