UIControl Nicht Empfangen Berührt
Habe ich ein UIControl, das die Berührungen begann die Methode so auf:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
//More code goes here
Dieser Unterklasse von UIControl ist instanziiert in einer view-controller, es wird dann Hinzugefügt, als eine Untersicht auf, dass view-controller. Ich habe einen Haltepunkt an der berührt, begann die Methode der UIControl, und die Methode nie aufgerufen wird. Ich habe etwas Lesen und es scheint, dass die View-Controller hat eine gewisse Logik, die entscheidet, ob der pass auf touch-events auf die Untersichten. Das merkwürdige ist, dass ich eine andere Unterklasse von UIControl in der gleichen view-controller, und die touch-Ereignisse get weitergegeben wird, wenn der Benutzer Sie berührt!
Hier ist der vollständige code:
.h
#import <UIKit/UIKit.h>
@interface CustomSegment : UIView
@property (nonatomic, strong) UIImageView *bgImageView;
@property (nonatomic, assign) NSInteger segments;
@property (nonatomic, strong) NSArray *touchDownImages;
@property (nonatomic, readonly, assign) NSInteger selectedIndex;
@property (nonatomic, weak) id delegate;
- (id)initWithPoint:(CGPoint)point numberOfSegments:(NSInteger)_segments andTouchDownImages:(NSArray *)_touchDownImages;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
@end
.m
#import "CustomSegment.h"
@implementation CustomSegment
@synthesize bgImageView, segments, touchDownImages, selectedIndex, delegate;
- (id)initWithPoint:(CGPoint)point
numberOfSegments:(NSInteger)_segments
andTouchDownImages:(NSArray *)_touchDownImages
{
self = [super initWithFrame:CGRectMake(point.x, point.y, [[_touchDownImages objectAtIndex:0] size].width, [[touchDownImages objectAtIndex:0] size].height)];
if (self)
{
touchDownImages = _touchDownImages;
segments = _segments;
bgImageView = [[UIImageView alloc] initWithImage:[touchDownImages objectAtIndex:0]];
[self addSubview:bgImageView];
}
return self;
}
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
return YES;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject];
float widthOfSegment = [self frame].size.width / segments;
float bottomPoint = 0;
float topPoint = widthOfSegment;
for (int i = 0; i < segments; i++)
{
if ([touch locationInView:self].x > bottomPoint && [touch locationInView:self].x < topPoint)
{
[bgImageView setImage:[touchDownImages objectAtIndex:i]];
selectedIndex = i;
return;
}
else
{
bottomPoint = topPoint;
topPoint += topPoint;
}
}
}
@end
Die Lösung ist in einer doppelten thread hier durch 'jhabbot' stackoverflow.com/questions/1245248/...
InformationsquelleAutor Kyle Rosenbluth | 2012-02-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
tl;dr Setzen Sie alle Untersichten der UIControl zu
setUserInteractionEnabled:NO
. UIImageView ist, standardmäßig ist es auf wahr gesetzt.Original-Beitrag
Eine Sache, die ich vor kurzem gefunden, dass es hilft, wenn das oberste Untersicht UIControl hat
setUserInteractionEnabled:NO
. Ich kam auf das, weil ich hatte ein UIControl Unterklasse mit einer UIImageView, wie es nur die Untersicht und es funktionierte gut. UIImageView hatuserInteractionEnabled
eingestelltNO
standardmäßig.Ich hatte auch einen anderen UIControl mit einer UIView, wie es die meisten top-Untersicht (technisch das gleiche UIControl in einem anderen Bundesland). Ich glaube UIView standardmäßig
userInteractionEnabled == YES
, die ausgeschlossen, die Ereignisse behandelt werden, die UIControl. Einstellungen der UIView ' suserInteractionEnabled
zuNO
mein Problem gelöst.Ich weiß nicht, ob es das gleiche Problem hier, aber vielleicht hilft?
--
Edit: Wenn ich sage, oberste Sicht... wahrscheinlich alle Untersichten der UIControl zu
setUserInteractionEnabled:NO
Argh, diese wurde driving me crazy, und dann sah ich deine Antwort und habe versucht, Tippen außerhalb einer der Untersichten und es funktionierte. Danke!
InformationsquelleAutor btomw
Überprüfen
frame
s von allen übergeordneten Ansichten. Die Regel ist, dass, wenn sub-view (oder dessen Teil) der Ansicht ist, Sie außerhalb des sichtbaren Grenzen, keine touch-Ereignisse.InformationsquelleAutor ivanzoid
Ist es möglich, dass eine andere Ansicht für Ihre UIControl, und verhindern, dass es vom Empfang des touch-events. Eine andere Möglichkeit ist, dass
userInteractionEnabled
eingestellt istNO
irgendwo Fehler.EDIT: ich sehen, dass Sie fügte hinzu, mehr code oben. Haben Sie überprüft, dass Ihre Sicht der Rahmen hat eine Höhe und eine Breite, die größer als null? Es sieht für mich so aus, das Sie anrufen "Größe", die direkt auf ein Objekt aus NSArray ('id'). Ich weiß nicht, wie Sie dies tun, ohne einen cast (vielleicht die Klammer nicht durch die oben genannten?) aber wenn man irgendwie abziehen, ich wäre nicht überrascht, wenn es wurde ein Ungültiger Wert.
InformationsquelleAutor borrrden
Möglichkeiten:
InformationsquelleAutor Shameem
Fair genug. Vor kurzem wieder untersucht (UIControl ist sehr schlecht dokumentiert) und festgestellt, dass tracking berührt, ist ein Ersatz für die touchesBegan/Endete, nicht eine zusätzliche, es tut mir so Leid. Ich würde Umgekehrt die Stimme, aber es ließ mich nicht 🙁
InformationsquelleAutor Ash
Erstens, warum nennen Sie
[super touchesBegan:touches withEvent:event];
? Dieser Anruf weiterleiten des Ereignisses an das nächste responder. In der Regel Sie tun es nur, wenn Sie nicht wollen, auf das Ereignis zu behandeln. Sind Sie sicher, dass Sie wissen, was machst du da?Eine Idee warum es nicht funktioniert - kann es sein dass du eine gestik-Erkennung, die das Ereignis behandelt zuerst?
Sowieso, tun Sie wirklich brauchen, um zu überschreiben
touchesBegan
?UIControl
gemacht zu verfolgen, die touch-events, indem Sie sich selbst und rufen Sie Ihren Handler Reaktion. Und dieUIControl
docs sagen, WIE um eine Unterklasse.Eine andere Idee - es ist von innen ein
UIScrollView
denen storniert, die berührt, für dessen Inhalt ist? Es gibt so viele Möglichkeiten.Dinge einfacher machen, die ich erstellt eine leere Anwendung mit einem leeren vc und das einzige, was ich in Sie setzen, die Kontrolle. Immer noch gleiche problem. Das ist sehr frustrierend, aber danke für all Eure Hilfe.
Kannst du uns den code?
An dieser Stelle könnte ich auch, die Bearbeitung ursprünglichen post mit dem obigen code Hinzugefügt
InformationsquelleAutor Sulthan
UIView-Instanzen sind nicht in der Lage, auf Ereignisse zu reagieren, so dass es keine Möglichkeit gibt, bis zu Ihrer aktuellen Konfiguration, zum auslösen der action-Methode ?
Versuchen, die Klasse zu wechseln der Ansicht, um eine Instanz der Klasse UIControl !
InformationsquelleAutor LAOMUSIC ARTS