Frage

Ich habe eine UIPickerView, die zu 20% alpha ausgeblendet werden, wenn nicht in Gebrauch ist. Ich möchte, dass die Benutzer in der Lage sein, den Picker zu berühren und ihn verblassen wieder in.

Ich kann es an der Arbeit, wenn ich eine touchesBegan Methode auf der Hauptansicht setzen, aber dies funktioniert nur, wenn der Benutzer den Blick. Ich habe versucht, Unter Klassierung UIPickerView und touchesBegan dort zu haben, aber es hat nicht funktioniert.

Ich vermute, es ist etwas mit der Responder-Kette zu tun, aber kann nicht scheinen, um es zu trainieren.

War es hilfreich?

Lösung

Ich habe über eine Woche lang für dieses Problem eine Lösung gesucht. Ich antworte Ihnen auch wenn Sie Frage über ein Jahr alt ist der Hoffnung, das hilft anderen.

Sorry, wenn meine Sprache nicht sehr technisch ist, aber ich bin ziemlich neu in Objective-C und iPhone Entwicklung.

Subclassing UIPickerView ist der richtige Weg, es zu tun. Aber Sie haben die - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event Methode außer Kraft zu setzen. Dies ist die Methode aufgerufen, wenn Sie den Bildschirm berühren und es gibt die Ansicht, die auf die Berührung reagieren. Mit anderen Worten wird die Ansicht, deren touchesBegan:withEvent: Methode aufgerufen werden.

Die UIPickerView hat 9 Subviews! In der UIPickerView Klassenimplementierung - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event wird nicht zurückkehren self (das bedeutet, die touchesBegan:withEvent: Sie in der Unterklasse schreiben, wird nicht genannt werden), sondern eine Subview zurückkehren, genau den Blick auf Index 4 (eine nicht dokumentierte Unterklasse genannt UIPickerTable).

Der Trick besteht darin, die - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event Methode, um self zurückzukehren, so dass Sie die Kontrolle über die touchesBegan:withEvent:, touchesMoved:withEvent: und touchesEnded:withEvent: Methoden haben.

Bei diesen Verfahren, um die Standardfunktionalitäten des UIPickerView zu halten, müssen Sie daran denken, sie zu nennen wieder, aber auf der UIPickerTable subview.

Ich hoffe, das macht Sinn. Ich kann nicht Code jetzt schreiben, sobald ich zu Hause bin, dass ich diese Antwort bearbeiten und einige Codes hinzufügen.

Andere Tipps

Hier ist ein Code, der tut, was Sie wollen:

@interface TouchDetectionView : UIPickerView {

}
- (UIView *)getNextResponderView:(NSSet *)touches withEvent:(UIEvent *)event;
@end
@implementation TouchDetectionView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UIView * hitTestView = [self getNextResponderView:touches withEvent:event];
    [hitTestView touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UIView * hitTestView = [self getNextResponderView:touches withEvent:event];
    [hitTestView touchesMoved:touches withEvent:event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UIView * hitTestView = [self getNextResponderView:touches withEvent:event];
    [hitTestView touchesEnded:touches withEvent:event];
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    UIView * hitTestView = [self getNextResponderView:touches withEvent:event];
    [hitTestView touchesCancelled:touches withEvent:event];
}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    return self;
}

- (UIView *)getNextResponderView:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch * touch = [touches anyObject];
    CGPoint point = [touch locationInView:self];
    UIView * hitTestView = [super hitTest:point withEvent:event];

    return ( hitTestView == self ) ? nil : hitTestView;
}

Die beiden oben genannten Antworten waren sehr hilfreich, aber ich habe ein UIPickerView innerhalb eines UIScrollView verschachtelt. Ich mache auch kontinuierlichen Rendering an anderer Stelle auf dem Bildschirm, während die GUI vorhanden ist. Das Problem ist, dass die UIPickerView nicht vollständig aktualisiert werden, wenn: eine nicht-ausgewählte Zeile abgegriffen wird, wird der Kommissionierer bewegt, so dass zwei Reihen den Auswahlbereich überspannen, oder eine Reihe gezogen wird, aber die Finger gleiten außerhalb des UIPickerView. Dann ist es nicht, bis die UIScrollView bewegt wird, dass der Kommissionierer sofort aktualisiert. Dieses Ergebnis ist hässlich.

Das Problems der Ursache: mein ständiges Rendering der UIPickerView Animation aus hielt die CPU-Zyklen immer es erforderlich zu beenden, damit die korrekte, aktuelle Auswahl zu zeigen. Meine Lösung --which works-- war: in der UIPickerView der touchesEnded:withEvent:, führt etwas mein Rendering für eine kurze Zeit zu unterbrechen. Hier ist der Code:

#import "SubUIPickerView.h"

@implementation SubUIPickerView

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    [pickerTable touchesBegan:touches withEvent:event];
}

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    [pickerTable touchesMoved:touches withEvent:event];
}

- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    [singleton set_secondsPauseRendering:0.5f];  // <-- my code to pause rendering

    [pickerTable touchesEnded:touches withEvent:event];
}

- (void) touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
{
    [pickerTable touchesCancelled:touches withEvent:event];
}

- (UIView*) hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
    if (CGRectContainsPoint(self.bounds, point))
    {
        if (pickerTable == nil)
        {
            int nSubviews = self.subviews.count;
            for (int i = 0; i < nSubviews; ++i)
            {
                UIView* view = (UIView*) [self.subviews objectAtIndex:i];
                if ([view isKindOfClass:NSClassFromString(@"UIPickerTable")])
                {
                    pickerTable = (UIPickerTable*) view;
                    break;
                }
            }
        }
        return self;    // i.e., *WE* will respond to the hit and pass it to UIPickerTable, above.
    }
    return [super hitTest:point withEvent:event];
}

@end

und dann die Kopfzeile, SubUIPickerView.h:

@class UIPickerTable;

@interface SubUIPickerView : UIPickerView
{
    UIPickerTable*  pickerTable;
}

@end

Wie ich schon sagte, das funktioniert. Rendering Pausen für eine zusätzliche 1/2 Sekunde (es Pausen bereits, wenn Sie die UIScrollView schieben) ermöglicht die UIPickerView Animation zu beenden. Mit NSClassFromString () bedeutet, dass Sie keine undokumentierte APIs. mit der Responder-Kette Spielerisch war nicht erforderlich. Dank checcco und Tylerc230 mir geholfen kommen mit meiner eigenen Lösung!

Set canCancelContentTouches und delayscontenttouches der Eltern im Hinblick auf NO, die für mich gearbeitet

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top