2013-01-05 39 views
3

我不知道這一點,我不認爲this真的解釋它。爲什麼設置UILabel完全透明會失去輕敲手勢?

我有一個UILabel可以由用戶加以利用,以隱藏或顯示其上,建立這樣的:

self.numberLabel.userInteractionEnabled = YES; 
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
    initWithTarget:self action:@selector(hideOrShowNumber)]; 
[self.numberLabel addGestureRecognizer:tapGesture]; 

我想通過設置alpha值動畫標籤的隱藏和顯示在UILabel。但是,如果我將alpha值設置爲0.0f,則標籤不再接受水龍頭,所以即使用戶可以隱藏標籤,她也不會再顯示它!

我的解決辦法是這樣的:

下隱藏標籤: - 動畫alpha值爲0.0f。 - 將標籤的文本顏色設置爲黑色(由於背景爲黑色,使其不可見) - 將alpha重置爲1.0f。

顯示標籤時: - 將alpha設置爲0.0f(因爲當標籤被隱藏時它保留在1.0f)。 - 將文本顏色設置爲另一種顏色,而不是黑色(取決於遊戲狀態)。 - 將alpha值設置爲1.0f。

的代碼看起來像這樣(有包括了一些狀態變量,但self.numberLabel是參考UILabel):

NSTimeInterval duration = 0.6f; 

if (self.numberIsVisible) { 
    [UIView animateWithDuration:duration 
        animations:^{ 
         self.numberLabel.alpha = 0.0f; 
        } 
        completion:^(BOOL done) { 
         self.numberLabel.textColor = [UIColor blackColor]; 
         self.numberLabel.alpha = 1.0f; 
        } 
    ]; 
    self.numberIsVisible = NO; 
} 
else { 
    UIColor *rightColor = [UIColor whiteColor]; 

    if ([GameState sharedGameState].haveMatch) { 
     rightColor = [UIColor colorWithRed:0.0/255.0 green:127.0/255.0 blue:255.0/255.0 alpha:1.0]; 
    } 

    self.numberLabel.alpha = 0.0f; 
    self.numberLabel.textColor = rightColor; 

    [UIView animateWithDuration:duration 
        animations:^{ 
         self.numberLabel.alpha = 1.0f; 
        } 
    ]; 

    self.numberIsVisible = YES; 
} 

它的工作原理,但它是一個有點麻煩。

所以問題是,爲什麼確實設置了UILabel的透明度使其失去用戶交互?這是否是設計的,是否在某處被記錄?我在UIGestureRecognizer文檔中找不到關於此的任何內容。

+0

看看Ole Begemann的OBShapedButton - 他的代碼應該可以幫助你解決這個問題。 –

+1

@rokjarc謝謝,但我有一個解決方法(見上文),另一個組件真的矯枉過正。我對標籤感到滿意,我不需要非矩形按鈕。所以這不是一個真正的問題。我在問爲什麼這樣。就個人而言,我認爲「隱藏」與(完全)「透明」略有不同,但UIKit似乎認爲不同,正如許多答案中指出的那樣。 –

+0

嗨,傑爾,我不認爲你會使用OBShapedButton而不是標籤。這個想法是要看看這個透明/觸摸問題應該如何處理:使用cublassing和使用hitTest。 –

回答

3

從官方doc調節觸摸事件分發部分

關閉觸摸事件的傳遞。默認情況下,視圖會收到 觸摸事件,但您可以將其userInteractionEnabled屬性設置爲 否以關閉觸摸事件的傳送。 如果視圖隱藏或透明,則視圖也不會收到

對視圖具有完全透明度(alpha = 0)被認爲與隱藏視圖類似,所以在這種情況下應該處理用戶交互沒有理由。您可以嘗試使用幾乎透明的UILabel。似乎是0.1的一個alpha。

1

顯然這種行爲曾經被記錄,但我無法在當前的文檔中找到它。

看到這個答案:Why doesn't touchesBegan fire on UIViews when alpha is set to zero?

「默認情況下,視圖接收觸摸事件,但可以將其userInteractionEnabled屬性設置爲NO,關閉事件的傳遞。視圖還,如果它是隱藏的,或者如果它是透明的不接收事件「

有沒有理由,你隱藏的需求UILabel是相同視圖接收觸摸到一個更簡單的解決方法是:。

  1. 添加您希望用戶能夠挖掘
  2. 手勢識別添加到包裝視圖
  3. 做出手勢識別的作用只是隱藏或顯示標籤
包裝的UIView
2

似乎任何UIView的alpha值爲< 0.1f的行爲好像隱藏屬性設置爲YES。換句話說,由於您的視圖是透明的,它不會收到觸摸事件。看到這個post

2

至少在iOS 8中,您可以將alpha設置爲0.01(不再是極限0.1),觸發事件將被觸發。如果它是0.0觸摸事件將不會被觸發。

更新:我已經發現在iOS 8.2以及更早的版本中,限制爲0.001960785。非常接近完全透明。也許這個數字可能會更小,我沒有進一步的小數位。

0

我通過創建一個包含空格的UILabel解決了這個問題,然後根據需要使用Autolayout約束來增長/縮小。

相關問題