我們知道,在IOS中UIButton UIControl都有一個默認的選中效果,即點中后會圖標會變暗,移開后又恢復正常。如何讓UIView UIImageView等這些普通的view也實現同樣的效果呢?
最近的一個項目里面,需要實現一個類似iPad/iPhone的主界面效果,但是不同的是,每個item里面顯示圖片的都必須是UIImageView,因為icon的圖片是從服務端異步下載下來的。而iPad的主界面里面,顯示圖片的載體應該是一個Button,已經自帶着重效果了。現在的任務是實現UIImageView的陰影着重效果。
其實要實現只需往Item(item = UIImageView + UILabel)添加三個touch事件:
[item addTarget:self action:@selector(itemTouchedUpInside:) forControlEvents:UIControlEventTouchUpInside];
[item addTarget:self action:@selector(itemTouchedUpOutside:) forControlEvents:UIControlEventTouchUpOutside];
[item addTarget:self action:@selector(itemTouchedDown:) forControlEvents:UIControlEventTouchDown];
[item addTarget:self action:@selector(itemTouchedCancel:) forControlEvents:UIControlEventTouchCancel];
下面我們用改變UImageView的alph透明度來代替陰影着重效果。陰影着重效果很簡單,但點擊的時候覆蓋一層黑色的半透明的View的即可,而代碼的位置也跟setAlpha:的位置相對應。
-(void)itemTouchedUpOutside:(MyLauncherItem *)item { item.imagView.alpha = 1; } -(void)itemTouchedDown:(MyLauncherItem *)item { item.imageView,alpha = 0.5; } - (void)itemTouchedUpInside:(MyLauncherItem *)item { item.imageView.alpha = 1; }
- (void)itemTouchedCancel:(MyLauncherItem *)item { item.imageView.alpha = 1; }
其中,只有touchDown才降低alhpa值,其他兩個事件都是用來恢復到原先狀態的。當我們觸摸item時,首先被響應的是touchDown事件,然后接下來響應的是touchUpInside還是touchUpOuside要取決於手指是否移動了。增加touchCancel處理是因為有時會出現按鈕按下后恢復不了原狀的情況,特別是在暴力測試情況下下,用多跟手指同時滑動圖標。
以上就是大體思路。若覺得着重的時間太短,可以在touchUpInside里面寫個GDB的dispatch_after延時處理操作,一半只要延時0.05秒最有效果就不錯了。
我的辦法比較土,如果有更好的方法可以留言交流一下。
