【问题标题】:UIGestureRecognizer for Rotation, Resize, Move On Edges of UIViewUIGestureRecognizer 用于旋转、调整大小、在 UIView 的边缘移动
【发布时间】:2013-10-12 11:22:16
【问题描述】:

我希望我的UITextView 能够工作并且看起来类似于裁剪实用程序(参见下图示例),但我找不到正确的方法来使用视图的边缘来移动、旋转、调整视图大小:



我成功地将UIGestureRecognizers 应用到我的整个UITextView 以移动(或平移)和旋转它,但是当业务涉及所有 4 个节点都可以移动、旋转或调整视图大小的边缘功能时,我得到了卡住了,因为节点很难完全发挥作用。我尝试了两种方法:

1.将所有 4 个节点添加为 UIImageView 作为 UITextView 的子视图。 当节点一半在 UITextView 边缘之外时,我使用 clipsToBound = NO; 使它们正确显示。但是,视图外的节点对触摸没有响应。然后我尝试了解决方案 2...

2。将 UITextView 包裹在容器 UIView 中,并为每个边添加 4 个节点,UITextView 正确定位在里面。 这样我实现了良好的 UI,但手势识别器仍然无法正常工作,因为它们可能嵌套得太深视图是另一个已经有手势识别器的视图的子视图。这需要更多调查,但我觉得这种方法有点太复杂了。

我走对了吗?也许,UIGestureRecognizer 不是我想要实现的这个目标的正确解决方案。如果有人有类似的工作经验,请指出我正确的方向。我不是在寻找代码,而是在寻找想法......

【问题讨论】:

    标签: iphone ios objective-c uigesturerecognizer


    【解决方案1】:

    方法 1 不起作用(没有一些黑客攻击),因为 UIView 的命中测试不会响应超出其边界的触摸。 (有关黑客,请参阅interaction beyond bounds of uiview

    方法#3 是正确的,你应该继续追求它。但是,您可以尝试在自定义 UIView 子类上使用 touchesBegan:withEvent:

    我的想法:

    1. 我已经使用以下技术实现了类似的调整大小控制。与手势识别器相比,您拥有更多的控制权,因为普通 UIGestureRecognizer 往往在它们开始响应时有一些最小距离,这在这种情况下并不理想,因为您希望 near 即时响应。此外,您知道自己已经有一些手势识别器,因此不太可能发生冲突。

    2. 许多人可能会建议您设计自己的 UIGestureRecognizer 来封装和解决我上面概述的一些问题。这可能是一种更简洁的方法,但您只需要实现几个 UIGestureRecognizer 委托方法,例如

      • gestureRecognizerShouldBegin:gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: 防止与其他手势识别器同时交互。 您可能还需要使用requireGestureRecognizerToFail: 要求某些手势识别器仅在其他人失败时才激活。

    也许您可以从 #1 开始,让它发挥作用,然后在理想情况下将其重构为 #2。

    想法 1 的示例代码

    typedef enum  {
         HandleTopLeft,
         HandleTopRight,
         HandleBottomLeft,
         HandleBottomRight
    }
    HandlePosition; //you will need fewer
    
    @protocol SizingHandleDelegate;
    
    @interface SizingHandle : UIView
    @property (nonatomic, assign) id<SizingHandleDelegate> delegate;
    @property (nonatomic, assign) HandlePosition position;
    @end
    
    
    @protocol SizingHandleDelegate <NSObject>
    
    - (void)touchesBeganForSizingHandle:(SizingHandle*)sizingHandle;
    - (void)touchesEndedForSizingHandle:(SizingHandle*)sizingHandle;
    
    @end
    

    您的 SizingHandle 类应覆盖 touchesBegan:withEvent:touchesEnded:withEvent:: 并将这些消息转发给它们的代表。然后委托应该能够应用正确的逻辑。

    此外,您可能希望处理用户一次触摸多个 SizingHandle 的用例。

    【讨论】:

    • 感谢您的宝贵意见。
    【解决方案2】:

    当我有这样的要求时,我尝试使用以下链接中的示例代码之一来实现它,它真的很有帮助。

    CropImageSampleCodes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多