【问题标题】:switching objects during a gesture (drag and drop)在手势期间切换对象(拖放)
【发布时间】:2012-09-30 07:53:33
【问题描述】:

我正在创建一个带有拖放可重新排列事件的日历。

视图层次结构如下所示:
ViewController - ScrollView - CalendarWeekView - EventView

滚动视图启用了分页,我一次显示一周。为了实现跨周的连续滚动,我在滚动时回收了三个 WeekCalendarView 对象。各个 EventView 是 CalendarWeekView 的子视图。

我希望能够将 EventViews 从一个星期拖放到另一个星期。

我在可见的一周内通过 EventViews 上的 UILongPressGestureRecognizer 设置进行了拖放操作。我在 WeekView 中添加了“热边缘”以触发滚动,这样我就可以从当前一周拖放到它工作的任一侧。

但是,如果我从第一周滚动超过一周,则会发生视图回收,并且创建并“拥有”我正在拖动的 EventView 的 WeekView 将被回收(属性重置)。我正在拖动的事件对象被重置并重用,从而终止了拖动行为(或者最好是在拖动中更改被拖动的事件!)。

我想我需要将拖动视图与 WeekViews 分离,在拖动时为我的事件创建一个新对象。

如何将 EventView 中的长按手势事件传递给这个新对象?

【问题讨论】:

    标签: ios cocoa-touch drag-and-drop uigesturerecognizer


    【解决方案1】:

    如何将 EventView 中的长按手势事件传递给这个新对象?

    正如您所建议的:D 您可以使用addTarget:action:removeTarget:action: 来调整手势识别器调用什么对象的方法。如果您愿意,您甚至可以同时拥有多个目标。

    在你的情况下,你可能想要这样的东西:

    [g removeTarget:self action:NULL]; // Remove everything that this object added
    [g addTarget:newObject action:newSEL];
    

    编辑:由于您正在拖动一个特定的 EventView,而不是创建一个新的 EventView 并处理洗牌 GR,请尝试将拖动的 EventView 移动到另一个超级视图(可能是滚动视图,尽管我什至使用了 UIWindow这种事)。

    【讨论】:

    • 非常抱歉,我过早地接受了您的回答。您的解决方案将手势目标移动到新视图,但是当原始视图被回收时,手势识别器本身(现在以新视图为目标)消失。 :( 是否可以移动手势识别器本身?我尝试了显而易见的方法:dragView.gestureRecognizers = sender.gestureRecognizers; sender.gestureRecognizers = nil; 但是 nil 会杀死手势。
    • 切换哪个视图拥有 GR 的更好方法是使用 addGestureRecognizer: 和 removeGestureRecognizer:。但是 removeGestureRecognizer: 可能会以相同的方式重置 GR。见编辑。您可能可以继续使用相同的视图,而不是移动 GR。
    • 在视图之间移动手势识别器有效!我遍历源视图上的所有手势识别器,找到 LongPress 并使用 addGestureRecogniser 将其添加到目标视图。从源视图中删除它似乎没有任何影响。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2014-11-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多