2009-07-28 60 views
2

我成功創建了一個自定義鍵盤,其功能類似於Apple的鍵盤。有一點仍然不同。在Apple的iPhone鍵盤上,用戶可以通過鍵盤輕掃他們的手指,並且他們通過的所有按鍵都會彈出。在我的鍵盤上,這不會發生。用手指擦拭手指只會導致我碰到的第一個按鈕彈出,而當我距離足夠遠時它會回落。我目前使用此代碼爲彈出鍵:懸停在iPhone上的UIButton狀態

UIImage *bigLetter = [UIImage imageNamed:@"letter1.png"]; 
[keyOne setImage:bigLetter forState:UIControlStateHighlighted]; 

keyOne是一個UIButton,當用戶「亮點」,或輕敲鍵盤上的鍵,我將覆蓋更大的字符的圖像。是否有類似的狀態只是「懸停」,以便如果用戶突出顯示Q鍵並將他們的手指滑動到W鍵上,則W鍵突出顯示?

+0

你也可以考慮在努力適應一個5等級系統,如http://stackoverflow.com/a/4667025/676822來完成你想要什麼 – Lucas 2013-01-22 16:50:40

回答

0

查看UIControlEvents枚舉。這是您可以爲特定視圖捕捉的所有事件。

如果我不得不猜測,我會說你可以使用TouchDown和TouchDrag系列的一些組合來複制這個功能。使用TouchUp來捕捉被觸摸的鍵。

0

可以使用touchesMoved:withEvent:方法你的容器的UIView的方法和喜歡的東西擊中測試每個子視圖(又名鍵):

for(key in keys){ 
    location = [touch locationInView:key]; 
    if([key pointInside:location withEvent:event]){ 
    // if not already animated or otherwise triggered, trigger 
    } 
} 

的想法是使用父視圖處理觸摸序列。當觸摸移動到(UIControl *)子視圖的「熱區」之外時,這是避免順序終止的簡單方法。

6

我爲我的應用程序,化合物實施了週期表鍵盤。

不要使用UIButtons。

要顯示你的鍵盤,使用: UIViews或CALayers顯示各個鍵

OR

靜態PNG。記憶和「zippier」更容易。 (這是我爲我的未來更新所做的)

您必須使用父視圖跟蹤所有觸摸。 (小拋開添加在底部來解釋爲什麼會是這樣)執行觸摸方法,像這樣:

- (void)touchesBegan: (NSSet *)touches 
      withEvent: (UIEvent *)event { 
    NSLog(@"TouchDown"); 

    CGPoint currentLocation = [[touches anyObject] locationInView:self.view]; 
    [self magnifyKey:[self keyAtPoint:currentLocation]]; 
} 

-(void)touchesMoved: (NSSet *)touches 
      withEvent: (UIEvent *)event { 
    NSLog(@"TouchMoved"); 

    CGPoint currentLocation = [[touches anyObject] locationInView:self.view]; 
    [self magnifyKey:[self keyAtPoint:currentLocation]];  
} 


-(void) touchesEnded: (NSSet *)touches 
      withEvent: (UIEvent *)event{ 

    NSLog(@"TouchUp"); 

    CGPoint currentLocation = [[touches anyObject] locationInView:self.view]; 

    int key = [self keyAtPoint:currentLocation]; 
    [self selectKey:aKey]; 
} 

這些方法拿到鑰匙,並適當地「放大」的選擇鍵。

我對CGRects數組運行該點以確定按鍵(這與點擊測試相比更快)。

- (int)keyAtPoint:(CGPoint)aPoint{ 

    int aKey=1; 
    for(NSString *aRect in keys){ 
     if(CGRectContainsPoint(CGRectFromString(aRect), aPoint)){ 
      break; 
     } 
     aKey++; 
    } 

    if(aKey==kKeyOutOfBounds) 
     aKey=0; 
    NSLog([NSString stringWithFormat:@"%i",aKey]); 
    return aKey; 
} 


- (void)magnifyKey:(int)aKey{ 

     if(aKey!=0) { 

      if(magnifiedKey==nil){ 

       self.magnifiedKey = [[[MagnifiedKeyController alloc] initWithKey:aKey] autorelease]; 
       [self.view addSubview:magnifiedKey.view];  

      }else{ 

       [magnifiedKey setKey:aKey]; 
       if([magnifiedKey.view superview]==nil) 
        [self.view addSubview: magnifiedKey.view];  

      } 

     }else{ 

      if(magnifiedKey!=nil) 
       [magnifiedKey.view removeFromSuperview]; 
     } 
    } 


    - (void)selectKey:(int)aKey{ 

     if(magnifiedKey!=nil){ 

      if(aKey!=0){ 

       [magnifiedKey flash]; 
       [self addCharacterWithKey:aKey]; 
      } 
      [magnifiedKey.view performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.5]; 
     } 
    } 

有幾種方法可供您實施,但它非常簡單。你基本上正在創造一個放大的關鍵視圖。然後在用戶滑動手指時移動它。


旁白:

因爲一旦觸摸是由一個視圖跟蹤你不能跟蹤與子視圖觸摸,它會繼續跟蹤觸摸到touchesEnded:(或touchesCancelled :)被調用。這意味着,一旦字母「Q」正在跟蹤觸摸,其他鍵就無法訪問該觸摸。即使你在字母「W」上盤旋。這是一種可以在其他地方使用的行爲,但在這種情況下,您必須通過擁有一個「父視圖」來處理它,而「父視圖」的作用是跟蹤觸摸。


(更新修復內存泄漏)

+0

尼斯。如果你將`MagnifiedKeyController`實例化爲蝙蝠而非懶惰,它可能會簡化代碼。現在,如果`magnifiedKey`屬性是retain屬性,我認爲你有內存泄漏。即使它是一個賦值屬性,在dealloc期間釋放一個賦值屬性ivar也不常見。 – 2009-07-29 16:20:09