2014-10-23 2 views
1

CCScrollView을 사용하는 방법에 대한 유용한 자습서 또는 설명 을 찾을 수 없습니다. 스프라이트와 라벨의 그리드 레이아웃 (iOS 게임의 업적 나열)이 있습니다. 화면에 맞출 수있는 것 이상의 것이 있으므로 사용자가 스크롤 할 수 있기를 바랍니다.CCScrollView 스크롤 및 터치 이벤트가 발생하지 않습니다

스크롤하려면 아래쪽에있는 스프라이트 등을 보이기 위해 위쪽으로 스 와이프/팬합니다.

몇 가지 코드 샘플을 발견했으며 스크롤 노드에 콘텐츠 노드를 추가하기 만하면됩니다. 나머지 노드는이를 처리 할 것입니다.

작동하지 않는 것 같습니다. 스크롤이 없으며 스크롤 레이어의 팬/터치 이벤트가 실행되지 않습니다. 동일한 자식 (스크롤 뷰의 형제)에있는 닫기 버튼은 더 이상 작동하지 않습니다.

저는 SpriteBuilder를 사용하지 않습니다.

// Node to hold all sprites/labels 
scrollContents = [CCNode node]; 

// I add a bunch of sprites/labels in a grid view 
for(NSString *key in badgeKeys){ 

    // logic to load the sprite would be here 

    CCSprite *badge = [CCSprite spriteWithSpriteFrame:frame]; 
    badge.positionType = CCPositionTypeNormalized; 
    badge.position = ccp(xPos,yPos); 
    [scrollContents addChild:badge]; 

    // some logic to increment x/y position logic, for grid layout 

} 

// Scroll view 
scrollView = [[CCScrollView alloc] initWithContentNode:scrollContents]; 
scrollView.horizontalScrollEnabled = NO; 
scrollView.verticalScrollEnabled = YES; 
[scrollView setBounces:NO]; 

// My sprites never even show unless I manually set this 
scrollContents.contentSize = CGSizeMake(self.contentSize.width,960); 
NSLog(@"scrollContents contentsize: %f %f", scrollContents.contentSize.width,scrollContents.contentSize.height); 

[self addChild:scrollView]; 
+1

: [GL_DEPTH24_STENCIL8_OES의 NSNumber numberWithUnsignedInt]. CCScrollViewDelegate 프로토콜을 구현하는 클래스 인스턴스에 위임합니다. – LearnCocos2D

+0

@ LearnCocos2D : '할 수있다'또는 '할 수도 있습니다'가 더 적절합니다. 델리게이트가 필수는 아니지만, 스크롤 뷰는 델리게이트없이 잘 스크롤됩니다. – YvesLeBorg

+2

@ helion3 : 스크롤 뷰 내용 크기를 설정해야합니다 (내용 노드 내용 크기와 다름). 제스처 인식기가 작동 할 영역을 정의하는 콘텐츠 크기가 없으면 터치 처리가 수행되지 않습니다. – YvesLeBorg

답변

2

확인, 여기에 작동하는 예는 내부에 '라이브'버튼 스크롤 메뉴 (내가 당신에게 완벽하게 작동하는 코드 예제를 제공하기 위해 내 코드의 일부를 해체)입니다. 난 그냥이

- (void) scrollingMenuWithCharmsTest { 

// setup something to scroll 

GameInventory *gi = [GameInventory sharedGameInventory]; 
while (gi.armorCharms.count < 20) { 
    [gi addArmorCharm:[ArmorCharm createRandomArmorCharm]]; 
} 

CCNode *contentNode = [self charmsContentNodeFor:gi.armorCharms 
            showEquiped:NO 
         spacingBetweenMenuItems:8 
              target:self 
             selector:@selector(onArmorCharmSelected:)]; 

// setup a clipping node to crop out the CCScrollingMenu 


CCNodeColor *ccn = [CCNodeColor nodeWithColor:[CCColor blackColor] width:180 height:200]; 
ccn.anchorPoint = ccp(0, 0); 
CCClippingNode *cn = [CCClippingNode clippingNodeWithStencil:ccn]; 
cn.alphaThreshold = 0.05f; 
[self addChild:cn]; 
cn.inverted   = NO; 
cn.positionInPointsV = ccp(50, 50); 
cn.anchorPoint   = ccp(0, 0); 
cn.contentSizeInPoints = CGSizeMake(180, 200); 

// setup scrolling menu 

CCScrollView * bsm = [[CCScrollView alloc] initWithContentNode:contentNode]; 
bsm.contentSize=CGSizeMake(180,200); 

[cn addChild:bsm]; 
bsm.position    = ccp(0, 0); 
bsm.bounces     = YES; 
bsm.pagingEnabled   = NO; 
bsm.verticalScrollEnabled = YES; 
bsm.horizontalScrollEnabled = NO; 

bsm.contentSizeInPoints = CGSizeMake(180, 200); // inPoints only after the node has a parent 

for (CharmAbstractBoxMenuItem *lmi in bsm.contentNode.children) { 
    TRACE(@"item %@ is at %@", lmi.item.description, NSStringFromCGPoint(lmi.positionInPointsV)); 
} 
TRACE(@"number of pages : %i", bsm.numVerticalPages); 

} 

- (CCNode *)charmsContentNodeFor:(NSDictionary *)keyedItems 
        showEquiped:(BOOL)isShowEquiped 
     spacingBetweenMenuItems:(float)inSpacing 
          target:(id)inTarget 
         selector:(SEL)inSelector { 

NSSortDescriptor *sortOrder = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]; 
NSArray   *sortedKeys = [[keyedItems allKeys] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortOrder]]; 

float initialY = 0; 
float currentY = initialY; 

NSUInteger  itemNumber = 0; 
CGFloat   width  = 0; 
CGFloat   height  = 0; 
CCNode   *contentNode = [CCNode node]; 
for (NSUInteger loopi  = 0; loopi < [sortedKeys count]; loopi++) { 
    NSString  *key = [sortedKeys objectAtIndex:loopi]; 
    CharmAbstract *ci = [keyedItems objectForKey:key]; 

    if (ci) { 
     CharmAbstractBoxMenuItem *cmi = [CharmAbstractBoxMenuItem itemBoxFor:ci 
                     target:inTarget 
                    selector:inSelector 
     ]; 

     cmi.toolTip = ci.toolTip; 
     cmi.position = ccp(deviceOffset(0), currentY); 
     cmi.key  = key; 
     [contentNode addChild:cmi z:0 name:[NSString stringWithFormat:@"%li", (long) itemNumber]]; 

     currentY += cmi.contentSizeInPoints.height + inSpacing; 
     itemNumber++; 
     if (cmi.contentSize.width > width) width = cmi.contentSize.width; 
     height += cmi.contentSize.height; 
     if (loopi < sortedKeys.count - 1) height += inSpacing; 
    } 
    else { 
     MPLOG(@"*** Key [%@] yielded no items.", key); 
    } 

} 
contentNode.contentSizeType = CCSizeTypePoints; 
contentNode.contentSize  = CGSizeMake(width, height); 
return contentNode; 

} 

몇 가지 메모를 작동,이 '해체'를 테스트 :

  • 당신은 위치와 크기에 대해 자세히 알 수 있도록 내가 당신에게 내 '컨텐츠 노드를 구축'루틴을했다.
  • 내 charmBoxMenuItemss는 'CCButton'에서 파생되었으며 매우 뜨겁습니다.이 코드 조각의 전체 버전에서 자르기 영역 외부의 버튼이 '뜨거워지지 않도록 CCScrollView를 확장했습니다 (보기에서 자르지 만, 그들은 여전히 ​​기본적으로 '가시적'이며, 자르기 영역 위 또는 아래에서 임의의 탭이 발생할 때 반응 할 수 있습니다. 스텐실로 노드를 클리핑를 들어
  • , 당신은 당신의 setupCocos2dWithOptions 라인이를 추가해야합니다

    CCSetupDepthFormat : 당신은있는 ScrollView를 설정해야

as seen on a simulator near you :)

+1

이것을 내 코드와 비교해 보았을 때 몇 가지 문제를 깨닫게되었습니다. 콘텐츠의 크기를 정규화 된 백분율로 지정했기 때문에 콘텐츠 크기를 조정하면 화면에서 벗어나는 경우가있었습니다. 둘째, 사용자 정의 팬 제스처 인식기를 사용했기 때문에 스크롤이 작동하지 않습니다. 따라서 'CCScrollView'노드에 대한 체크를 BSTR gestureRecognizer : (UIGestureRecognizer *) gestureRecognizer shouldReceiveTouch : (UITouch *) touch'에 추가했습니다. – helion3

관련 문제