ios - ScrollView 滚动和触摸事件从不触发

标签 ios cocos2d-iphone

我找不到关于如何使用 CCScrollView任何有用的教程或解释。我有一个 Sprite 和标签的网格布局(列出 iOS 游戏的成就)。屏幕上放不下的东西太多了,所以我希望用户能够滚动。

要滚动,用户会向上滑动/平移,以显示较低的 Sprite 等。

我找到了一些代码示例,它们似乎表明您只需将内容节点添加到滚动节点,它会处理其余部分。

好像不行。没有滚动,滚动层上的平移/触摸事件似乎永远不会触发。我在同一个 child ( ScrollView 的同级)上的关闭按钮也不再有效。

我没有使用 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];

最佳答案

好的,这是一个滚动菜单的工作示例(我解构了部分代码,为您提供了一个完整的工作代码示例),其中包含“实时”按钮。我刚刚测试了这个“解构”,它有效

- (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 以防止按钮在裁剪区域之外“变热”(尽管它们从 View 中被裁剪掉了,默认情况下它们仍然“可见”,并且可以在裁剪区域上方或下方随机点击时做出响应。
  • 对于带有模板的裁剪节点,您需要在您的 setupCocos2dWithOptions 行中添加:

    CCSetupDepthFormat : [NSNumber numberWithUnsignedInt:GL_DEPTH24_STENCIL8_OES]

as seen on a simulator near you :)

关于ios - ScrollView 滚动和触摸事件从不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26521173/

相关文章:

ios - 在真实设备中测试临时配置文件 - IOS XCode

iphone - cocos2D 从 iPhone 到 iPad

cocos2d-iphone - clang : error: invalid architecture 'arm' for deployment target '-mios-simulator-version-min=5.0'

ios - 如何计算真实世界的对象大小?

iphone - 即使我暂停游戏,菜单也能正常工作吗?

ios - Flutter build iOS 报错 : Requested but did not find extension point with identifier

ios - 使用Codable解析嵌套JSON数据问题

ios - 查找用户在 ScrollView 中拖动手指的 X 位置

ios - Swift 3日历添加分钟不改变日期

iphone - Cocos Denshion : Play sound effect in sync with music