方法 1 不起作用(没有一些黑客攻击),因为 UIView 的命中测试不会响应超出其范围的触摸。(对于 hack,请参阅 超出 uiview 范围的交互)
方法#3 是正确的,你应该继续追求它。但是,您可以尝试在自定义 UIView 子类上使用touchesBegan:withEvent:。
我的想法:
我已经使用下面的技术实现了类似的调整大小控制。你比手势识别器有更多的控制权,因为普通的 UIGestureRecognizers 往往有一些开始响应的最小距离,这在这种情况下并不理想,因为你想要近乎即时的响应。此外,您不太可能发生冲突,因为您知道您已经有一些手势识别器。
许多人可能会建议您设计自己的 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 的用例。