3

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



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

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

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

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

4

2 回答 2

0

方法 1 不起作用(没有一些黑客攻击),因为 UIView 的命中测试不会响应超出其范围的触摸。(对于 hack,请参阅 超出 uiview 范围的交互

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

我的想法:

  1. 我已经使用下面的技术实现了类似的调整大小控制。你比手势识别器有更多的控制权,因为普通的 UIGestureRecognizers 往往有一些开始响应的最小距离,这在这种情况下并不理想,因为你想要近乎即时的响应。此外,您不太可能发生冲突,因为您知道您已经有一些手势识别器。

  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 的用例。

于 2013-10-08T03:34:44.753 回答
0

When I had such a requirement, I tried to implement this using one of the sample codes from the below link, It really helped.

CropImageSampleCodes

于 2013-10-14T09:04:27.707 回答