Ich schreibe eine iOS 5 App (in Xcode 4.3, mit Storyboards und ARC), die einige Tabellenzellen hat, die auf horizontale Schwenks reagieren müssen. Ich hatte eine Tischkonfiguration, die wirklich gut funktionierte, aber dann musste ich das gleiche Verhalten in einer anderen Szene implementieren. Ich dachte, der beste Weg bestünde darin, den Gestenerkennungs- und -handhabungscode in Unterklassen zu abstrahieren. Aber jetzt scrollt die TableView nicht, und die Lösung, die ich für dieses Problem unter der alten Methode hatte, hilft nicht.Warum scrollt meine UItableView-Unterklasse nicht?
Ich habe eine RestaurantViewController
, die von UIViewController
erbt und hat eine Eigenschaft ULPanningTableView *tableView
. Einige der Zellen der Tabelle sind MenuItemCell
s und erben von ULPanningTableViewCell
. Delegat und Datenquelle der Tabelle sind die RestaurantViewController
.
ULPanningTableViewCell
erbt von UITableViewCell
und ist ziemlich nah an dem Original, der einzige Unterschied ist, dass es Eigenschaften hat, um die Vorder- und Rückseite der Zelle und die benutzerdefinierten Hintergründe zu verfolgen.
ULPanningTableView
ist ein bisschen komplizierter, da es die Erkennung und Handhabung einrichten muss.
ULPanningTableView.h
:
#import <UIKit/UIKit.h>
@interface ULPanningTableView : UITableView <UIGestureRecognizerDelegate>
@property (nonatomic) float openCellLastTX;
@property (nonatomic, strong) NSIndexPath *openCellIndexPath;
- (id)dequeueReusablePanningCellWithIdentifier:(NSString *)identifier;
- (void)handlePan:(UIPanGestureRecognizer *)panGestureRecognizer;
// ... some helpers for handlePan:
@end
und ULPanningTableView.m
:
#import "ULPanningTableView.h"
#import "ULPanningTableViewCell.h"
@implementation ULPanningTableView
@synthesize openCellIndexPath=_openCellIndexPath, openCellLastTX=_openCellLastTX;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
#pragma mark - Table View Helpers
- (id)dequeueReusablePanningCellWithIdentifier:(NSString *)identifier
{
ULPanningTableViewCell *cell = (ULPanningTableViewCell *)[self dequeueReusableCellWithIdentifier:identifier];
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[panGestureRecognizer setDelegate:self];
[cell addGestureRecognizer:panGestureRecognizer];
return cell;
}
#pragma mark - UIGestureRecognizerDelegate protocol
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// for testing: only allow UIScrollViewPanGestureRecognizers to begin
NSString *gr = NSStringFromClass([gestureRecognizer class]);
if ([gr isEqualToString:@"UIScrollViewPanGestureRecognizer"]) {
return YES;
} else {
return NO;
}
}
#pragma mark - panhandling
- (void)handlePan:(UIPanGestureRecognizer *)panGestureRecognizer
{
// ...
}
// ... some helpers for handlePan:
@end
ich um mit gestureRecognizerShouldBegin:
gespielt haben, denn das war, wie ich dieses Problem wieder gelöst, wenn diese nicht getrennte Klassen waren (ULPanningTableView
Sachen wurde in RestaurantViewController
und ULPanningTableViewCell
implementiert wurde Zeug in MenuItemCell
implementiert wurde.Ich würde im Wesentlichen zurück Nein für Gesten, wo t er translationInView
war mehr vertikal als horizontal). Jedenfalls kann ich den Tisch nicht zum Scrollen bringen! Ich kann die Schwenkbewegungen erkennen, wenn ich JA von gestureRecognizerShouldBegin:
zurückgebe, oder wenn ich die UIGestureRecognizerDelegate
Implementierung vollständig entferne.
Ich bin immer noch ein Anfänger in iOS, und in Objective-C, so habe ich nur Vermutungen basierend auf Dinge, die ich gelesen habe, und ich habe den Eindruck, von einem similar problem, dass der Täter ist UIScrollViewPanGestureRecognizer
tun Voodoo mit die Antwortsenderkette ...
Ich würde sehr schätzen jedes mögliches Licht, das Sie auf dieses abwerfen können!
Versuchen Sie, einen Blick in die Zelle zu bewegen, oder versuchen Sie, den Inhalt der Zelle, horizontal zu scrollen? – NJones
Horizontale Schwenkung sollte eine Ansicht in der Zelle verschieben. Ich konnte nicht herausfinden, wie ich mit dem Inhalt der Zelle interagieren sollte, um ihre 'backgroundView' zu zeigen, also bewege ich eine benutzerdefinierte Eigenschaft der Zelle' UIView * frontView'. Die vertikale Schwenkung sollte durch die Tabelle rollen. –