我一直試圖找出這個好幾個小時,在這裏完全無所適從。我試圖爲我的遊戲中的一些自定義UIImageView實現UIPinchGestureRecognizer
,但它不起作用。我研究過的所有東西都說它應該起作用,但事實並非如此。捏合工作正常,如果我將它添加到我的視圖控制器,或自定義UIView,但不是UIImageViews。我已經嘗試了所有常見的修復和調整,但沒有成功。我有userInteractionEnabled
和multipleTouchEnabled
設置爲是。我有代表和選擇器正確設置。我有shouldRecognizeSimultaneouslyWithGestureRecognizer
設置爲返回YES。UIPinchGestureRecognizer選擇器沒有被調用UIImageView
手勢識別器被添加到UIImageView中,我以後可以在我的更新循環中訪問它的屬性,但是選擇器中的NSLog永遠不會在我嘗試捏時被UIImageView調用。我已經調整了視圖的z位置以確保它們位於頂部但不是骰子。
我的UIImageView存儲在一個NSMutableDictionary中,並通過在遊戲的每個更新循環中循環更新。這可能會影響UIPinchGestureRecognizer沒有被調用嗎?......我不能想到其他任何東西,並且發佈代碼可能無濟於事 - 因爲當它用於UIView或視圖控制器時,相同的確切代碼會起作用。
我確實在視圖控制器的touchesBegan和touchedMoved事件中有觸摸處理代碼......但我已經關閉了,但問題仍然存在,並且無論如何這個捏合對其他元素都有效。
任何想法可以防止在UIImageView上觸發手勢選擇器?詞典?與在遊戲循環中不斷更新有什麼關係?任何想法都會受到歡迎,這似乎很容易實現......
編輯:這裏是UIImageView的代碼和我在做什麼...不知道這是否有幫助。
擴展UIImageView類Paper.m(PRP是用來初始化我的自定義變量屬性的struct
:
NSString *tName = [NSString stringWithUTF8String: prp.imagePath];
UIImage *tImage = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png",tName]];
self = [self initWithImage: tImage];
self.userInteractionEnabled = YES;
self.multipleTouchEnabled = YES;
self.center = CGPointMake(prp.spawnX, prp.spawnY);
if (prp.zPos != 0) { self.layer.zPosition = prp.zPos; }
// other initialization excised
然後,我有叫ObjManager一個自定義類,持有的NSMutableDictionary和初始化所有的UIImageView對象,像這樣,其中addObj被稱爲在循環中添加的每個對象:
- (ObjManager*) initWithBlank {
// create an array for our objects
self = [super init];
if (self) {
objects = [[NSMutableDictionary alloc] init];
spawnID = 100; // start of counter for dynamically spawned object IDs
}
return self;
}
- (void) addObj:(Paper *)paperPiece wasSpawned:(BOOL)spawned {
// add each paper piece, assign spawnID if dynamically spawned
NSNumber *newID;
if (spawned) { newID = [NSNumber numberWithInt:spawnID]; spawnID++; }
else { newID = [NSNumber numberWithInt:paperPiece.objID]; }
[objects setObject:paperPiece forKey:newID];
}
我的視圖控制器調用ObjManager(稱爲_world在我的VC)的初始化然後它遍歷_world像這樣:
// Populate additional object managers and add all subviews
for (NSNumber *key in _world.objects) {
_eachPiece = [_world.objects objectForKey:key];
// Populate collision object manager
if (_eachPiece.collision) {
[_world_collisions addObj:_eachPiece wasSpawned:NO];
}
// only add pinch gesture if the object flag is set
if (_eachPiece.pinch) {
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchPaper:)];
pinchGesture.delegate = self;
[_eachPiece addGestureRecognizer:pinchGesture];
NSLog(@"Added pinch recognizer scale: %@", pinchGesture.view.description);
}
// Add each object as a subview
[self.view addSubview:_eachPiece];
}
_eachPiece是在我的視圖控制器,在.h文件中聲明的對象(如_world):
@property (nonatomic, strong) ObjManager *world;
@property (nonatomic, strong) Paper *eachPiece;
然後,我有一個NSTimer對象,更新所有可移動的紙對象(的UIImageViews )在_world(ObjManager)每一幀像這樣:
// loop through each piece and update
for (NSNumber *key in _world.objects) {
eachPiece = [_world.objects objectForKey:key];
// only update moveable pieces
if ((eachPiece.moveType == Move_Touch) || (eachPiece.moveType == Move_Auto)) {
CGPoint paperCenter;
paperCenter = eachPiece.center;
// a bunch of code to update paperCenter x & y for the object's new position based on velocity and user input
// determine image direction and transformation matrix
[_world updateDirection:eachPiece];
CGAffineTransform transformPiece = [_world imageTransform:eachPiece];
if (transformEnabled) {
eachPiece.transform = transformPiece;
}
// finally move it
[eachPiece setCenter:paperCenter];
}
}
和夾送選擇器:
- (void)pinchPaper:(UIPinchGestureRecognizer *)recognizer {
NSLog(@"Pinch scale: %f", recognizer.scale);
recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
recognizer.scale = 1;
}
據我所知,捏應該工作。如果我採用相同的捏手勢代碼並將其設置爲添加到視圖控制器,它適用於整個視圖。我還有一個自定義的UIView類,它充當邊框(簡單地繪製在視圖周圍的一個矩形),並將捏合手勢代碼移動到只允許我捏住邊框。
當你說你的'UIImageViews'被更新時,你會創建新的UIImageViews還是你只需要改變他們的圖像,如果你爲新圖像下了一個'alloc init',所有的手勢都必須重新分配給新的圖片。感覺我沒有代碼來尋找這個問題,我必須嘗試並假設一些。 –
我的更新循環只更新UIImageView的位置(使用setCenter)或調用變換以更改顯示的圖像方向(即反轉圖像)。在UIImageView被初始化並添加到NSMutableDictionary之後,我添加了手勢識別器。我嘗試在初始化(自定義初始化方法)中添加它,但它也不起作用。 – BTGunner
發佈一些代碼,這將有助於我們 – spider1983