0

我一直試圖找出這個好幾個小時,在這裏完全無所適從。我試圖爲我的遊戲中的一些自定義UIImageView實現UIPinchGestureRecognizer,但它不起作用。我研究過的所有東西都說它應該起作用,但事實並非如此。捏合工作正常,如果我將它添加到我的視圖控制器,或自定義UIView,但不是UIImageViews。我已經嘗試了所有常見的修復和調整,但沒有成功。我有userInteractionEnabledmultipleTouchEnabled設置爲是。我有代表和選擇器正確設置。我有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類,它充當邊框(簡單地繪製在視圖周圍的一個矩形),並將捏合手勢代碼移動到只允許我捏住邊框。

+0

當你說你的'UIImageViews'被更新時,你會創建新的UIImageViews還是你只需要改變他們的圖像,如果你爲新圖像下了一個'alloc init',所有的手勢都必須重新分配給新的圖片。感覺我沒有代碼來尋找這個問題,我必須嘗試並假設一些。 –

+0

我的更新循環只更新UIImageView的位置(使用setCenter)或調用變換以更改顯示的圖像方向(即反轉圖像)。在UIImageView被初始化並添加到NSMutableDictionary之後,我添加了手勢識別器。我嘗試在初始化(自定義初始化方法)中添加它,但它也不起作用。 – BTGunner

+1

發佈一些代碼,這將有助於我們 – spider1983

回答

2

好了,所以顯然手勢識別不火的看法位置被動畫這裏。所以爲了使它工作,我必須把識別器放在視圖控制器上,然後執行一個命中測試,並在被觸摸的視圖上應用捏放/縮放,如果它是我想捏/放大的視圖。在這裏信息:

http://iphonedevsdk.com/forum/iphone-sdk-tutorials/100982-caanimation-tutorial.html

對於我的具體情況,我一直在跟蹤它的動畫意見,我想捏,在視圖控制器級別的變量/數組。然後,我在選擇使用此代碼(基本上是從上面的鏈接,所有爭光):仍在進行中,部分

- (void)pinchPaper:(UIPinchGestureRecognizer *)recognizer { 

    CALayer *pinchLayer; 
    id layerDelegate; 
    CGPoint touchPoint = [recognizer locationInView:self.view]; 

    pinchLayer = [self.view.layer.presentationLayer hitTest: touchPoint]; 
    layerDelegate = [pinchLayer delegate]; 

    //_pinchView is the UIView I want to pinch 
    if (layerDelegate == _pinchView) { 
     _pinchView.transform = CGAffineTransformScale(_pinchView.transform, recognizer.scale, recognizer.scale); 
     recognizer.scale = 1; 
    } 
} 

只有一件棘手的事情是,如果你有其他的縮放變換(如改變我的方向)現有的UIView動畫,你必須通過在每個更新循環中使用當前的變換來解決這個問題。

1

對於在imageView上工作的任何手勢識別器,必須在其上啓用userInteraction。

所以,它應該是,

yourImageView.userInteractionEnabled = YES; 

或者,如果您使用的是故事板,您就可以在故事板的檢查窗口的選擇了。

希望它能幫助.. :)

+0

是的,這是啓用,但它仍然無法正常工作。而且我不使用故事板,它都是硬編碼的。 – BTGunner