Iphone UIGestureRecognitor,用于在UIView的边上旋转、调整大小和移动

Iphone UIGestureRecognitor,用于在UIView的边上旋转、调整大小和移动,iphone,ios,objective-c,uigesturerecognizer,Iphone,Ios,Objective C,Uigesturerecognizer,我希望我的UITextView能够正常工作并看起来像裁剪工具(请参见下面的图像示例),但我找不到正确的方法来使用视图的边缘移动、旋转和调整视图大小: 我成功地将uigesturecognizers应用于我的整个UITextView以移动(或平移)和旋转它,但当业务涉及到边缘功能时,所有4个节点都会移动、旋转或调整视图大小,我会陷入困境,因为节点很难完全发挥功能。我尝试了两种方法: 1。将所有4个节点添加为UIImageView,作为UITextView的子视图,当节点位于我使用的UITextV

我希望我的
UITextView
能够正常工作并看起来像裁剪工具(请参见下面的图像示例),但我找不到正确的方法来使用视图的边缘移动、旋转和调整视图大小:



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

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

2。将
UITextView
包装在容器
UIView
中,并为每个边添加了4个节点,并将
UITextView
正确放置在内部。
通过此操作,我获得了良好的UI,但手势识别器仍然无法正常工作,因为它们可能嵌套在视图中太深,而该视图是另一个已经存在的视图的子视图有手势识别器。这需要更多的调查,但我觉得这个方法有点太复杂了

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

方法1无法工作(如果没有一些黑客攻击),因为UIView的命中测试不会对超出其边界的触碰做出响应。(有关黑客的信息,请参阅)

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

我的想法是:

  • 我使用下面的技术实现了一个类似的调整大小控件。与手势识别器相比,您有更多的控制权,因为正常的手势识别器往往有一些最小的开始响应距离,这在本例中并不理想,因为您需要接近即时的响应。此外,您不太可能有冲突,因为您已经有了一些手势识别器

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

    • 手势识别器应开始:
      手势识别器:应与手势识别器同时识别:
      ,以防止与其他手势识别器同时交互。 您可能还需要使用
      requiregestrerecognizertofail:
      要求某些手势识别器仅在其他手势识别器失败时激活
  • 也许你可以从#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
    
    typedef枚举{
    扶手左,
    手握正确,
    车把底部左,
    车把底部右侧
    }
    手位//你将需要更少的时间
    @协议大小和删除;
    @接口大小句柄:UIView
    @属性(非原子,赋值)id委托;
    @属性(非原子,赋值)手柄位置;
    @结束
    @协议大小调整和删除
    -(无效)触摸BeganforSizingHandle:(SizingHandle*)SizingHandle;
    -(无效)触摸指定手柄:(SizingHandle*)SizingHandle;
    @结束
    
    SizingHandle类应覆盖
    触摸开始:withEvent:
    触摸结束:withEvent:
    ,并将这些消息转发给其代理。然后,代理应该能够应用正确的逻辑


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

    当我有这样的要求时,我尝试使用下面链接中的一个示例代码来实现这一点,它确实很有帮助


    感谢您的宝贵意见。