3.3rc1 触屏在ScrollView 上的node , setTouchSwallowEnabled不起作用

发现个问题, 2.2.5版本 ScrollView 上的sprite 设置setTouchSwallowEnabled(true)后sprite能正常吞噬ScrollView 的触屏事件
但在3.3 rc1上却不行
代码是没有问题的

可以用下面代码测 打开例子touch TestSingleTouch2Scene.lua 将它修改成

import("…includes.functions")

local TestSingleTouch2Scene = class(“TestSingleTouch2Scene”, function()
return display.newScene(“TestSingleTouch2Scene”)
end)

function TestSingleTouch2Scene:ctor()
local l = cc.LayerColor:create(cc.c4b(100, 255, 100,100))
l:setContentSize(cc.size(display.width,display.height))
– parentButton 是 button1 的父节点
self.parentButton = createTouchableSprite({
image = “WhiteButton.png”,
size = cc.size(600, 500),
label = “TOUCH ME !”,
labelColor = cc.c3b(255, 0, 0)})
:pos(display.cx, display.cy)
:addTo(l)
self.scrollView = cc.ScrollView:create()
– scrollView:setDirection(kCCScrollViewDirectionHorizontal)
self.scrollView:setBounceable(true)
self.scrollView:setClippingToBounds(true)
self.scrollView:setDelegate()
self.scrollView:setViewSize(cc.size(display.width,display.height))
self.scrollView:setTouchEnabled(true)
self.scrollView:setContainer(l)
–self:addChild(l)
self:addChild(self.scrollView)

self.parentButton.name = "parentButton"
drawBoundingBox(self, self.parentButton, cc.c4f(0, 1.0, 0, 1.0))
self.parentButton:setTouchEnabled(true)
self.parentButton:addNodeEventListener(cc.NODE_TOUCH_EVENT, function(event)
    local label = string.format("parentButton: %s x,y: %0.2f, %0.2f", event.name, event.x, event.y)
    self.parentButton.label:setString(label)
    return true
end)

-- button1 响应触摸后,会吞噬掉触摸事件
self.button1 = createTouchableSprite({
        image = "GreenButton.png",
        size = cc.size(400, 160),
        label = "TOUCH ME !"})
    :pos(300, 400)
    :addTo(self.parentButton)
cc.ui.UILabel.new({text = "SWALLOW = YES\n事件在当前对象处理后被吞噬", size = 24})
    :align(display.CENTER, 200, 90)
    :addTo(self.button1)
drawBoundingBox(self, self.button1, cc.c4f(1.0, 0, 0, 1.0))

self.button1:setTouchEnabled(true)
self.button1:setTouchSwallowEnabled(true) -- 是否吞噬事件,默认值为 true
self.button1:addNodeEventListener(cc.NODE_TOUCH_EVENT, function(event)
    local label = string.format("button1: %s x,y: %0.2f, %0.2f", event.name, event.x, event.y)
    self.button1.label:setString(label)
    return true
end)

-- button2 响应触摸后,不会吞噬掉触摸事件
self.button2 = createTouchableSprite({
        image = "PinkButton.png",
        size = cc.size(400, 160),
        label = "TOUCH ME !"})
    :pos(300, 200)
    :addTo(self.parentButton)
cc.ui.UILabel.new({text = "SWALLOW = NO\n事件会传递到下层对象", size = 24})
    :align(display.CENTER, 200, 90)
    :addTo(self.button2)
drawBoundingBox(self, self.button2, cc.c4f(0, 0, 1.0, 1.0))

self.button2:setTouchEnabled(true)
self.button2:setTouchSwallowEnabled(false) -- 当不吞噬事件时,触摸事件会从上层对象往下层对象传递,称为“穿透”
self.button2:addNodeEventListener(cc.NODE_TOUCH_EVENT, function(event)
    local label = string.format("button1: %s x,y: %0.2f, %0.2f", event.name, event.x, event.y)
    self.button2.label:setString(label)
    return true
end)

-- 放置一个开关按钮在屏幕上
local labels = {}
labels = "父对象【可以】捕获触摸事件"
labels = "父对象【不能】捕获触摸事件"
local images = {on = "CheckBoxButton2On.png", off = "CheckBoxButton2Off.png"}
self.captureEnabledButton = cc.ui.UICheckBoxButton.new(images)
    :setButtonLabel(cc.ui.UILabel.new({text = labels, size = 24}))
    :setButtonLabelOffset(40, 0)
    :setButtonSelected(true)
    :onButtonStateChanged(function(event)
        local button = event.target
        button:setButtonLabelString(labels)
    end)
    :onButtonClicked(function(event)
        local button = event.target
        self.parentButton:setTouchCaptureEnabled(button:isButtonSelected())
    end)
    :pos(display.cx - 160, display.top - 80)
    :addTo(self)

cc.ui.UILabel.new({
    text = "当不允许父对象捕获触摸事件时,\n父对象及其包含的所有子对象都将得不到触摸事件",
    size= 24})
    :align(display.CENTER, display.cx, display.top - 140)
    :addTo(self)

--

app:createNextButton(self)
app:createTitle(self, "单点触摸测试 - 事件穿透和事件捕获")

end

return TestSingleTouch2Scene

嗯,我们验证下

原因是因为你的scrollview用的是ccs的控件,其他用的是quick自己的控件,这两类控件在同一个场景,不能混用

赞一个, 我也遇过类似的问题,查了好几天才找到。

这个我也遇到了,怎么解决的呢?是自己要手动写 scrollview:setTouchEnabled(false)吗

请问楼主怎么解决这类问题,我也遇到了,还不知道怎么解决???????????

那scrollview里面添加那些空间能用?display.newSprite的对象也穿透不了。