Ich habe für meine App, Compounds, eine Periodic-Table-Tastatur implementiert.
Verwenden Sie keine UIB-Tasten.
Tastatur anzuzeigen, verwenden entweder: UIViews oder CALayers die einzelnen Tasten angezeigt werden
OR
Eine statische PNG. Es ist viel einfacher auf Speicher und "Zippier". (Dies ist, was ich für mein noch zu kommen Update getan habe)
Sie müssen alle Berührungen mit der übergeordneten Ansicht verfolgen. (Small hinzugefügt beiseite am Boden zu erklären, warum das so ist) Implementieren Sie die Berührungen Methoden wie so:
- (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];
}
Diese Methoden die Schlüssel bekommen und angemessen „vergrößern“, um die ausgewählte Taste.
Ich führe den Punkt gegen ein Array von CGRects, um den Tastendruck zu bestimmen (dies ist schneller im Vergleich zum Treffertest).
- (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];
}
}
Es gibt ein paar Methoden für Sie zu implementieren, aber es ist ziemlich einfach. Sie erstellen im Grunde eine Ansicht, die ein vergrößerter Schlüssel ist. Dann bewegen Sie es herum, während der Benutzer seinen Finger schiebt.
Abgesehen:
Sie können nicht berührt mit Subviews verfolgen, denn sobald eine Berührung durch einen Blick verfolgt wird, es setzt die Note bis touchesEnded verfolgen: (oder touchesCancelled :) genannt wird.Das heißt, sobald der Buchstabe "Q" eine Berührung verfolgt, hat kein anderer Schlüssel Zugriff auf diese Berührung. Selbst wenn Sie über den Buchstaben "W" schweben. Dies ist ein Verhalten, das Sie anderswo zu Ihrem Vorteil nutzen können, aber in dieser Situation müssen Sie umgehen, indem Sie eine "Elternansicht" haben, deren Aufgabe es ist, Berührungen zu verfolgen.
(aktualisiert Speicherleck zu beheben)
Sie auch eine 5-Rating-System anzupassen, wie http://stackoverflow.com/a/4667025/676822 versuchen könnte prüfen, zu erreichen, was Sie – Lucas