1

我正在研究如何在 iOS6 中使用 UIPanGestureRecognizer 做某事,并查看了头文件 UIPanGestureRecognizer.h 的一部分:

NS_CLASS_AVAILABLE_IOS(3_2) @interface UIPanGestureRecognizer : UIGestureRecognizer {
    @package
    CGPoint         _firstScreenLocation;
    CGPoint         _lastScreenLocation;
    NSTimeInterval  _lastTouchTime;
    id              _velocitySample;
    id              _previousVelocitySample;
    NSMutableArray  *_touches;
    NSUInteger      _lastTouchCount;
    NSUInteger      _minimumNumberOfTouches;
    NSUInteger      _maximumNumberOfTouches;
    CGFloat         _hysteresis;
    CGPoint         _lastUnadjustedScreenLocation;
    unsigned int    _failsPastMaxTouches:1;
    unsigned int    _canPanHorizontally:1;
    unsigned int    _canPanVertically:1;
    unsigned int    _ignoresStationaryTouches:1;
}

@property (nonatomic)          NSUInteger minimumNumberOfTouches;   // default is 1. the minimum number of touches required to match
@property (nonatomic)          NSUInteger maximumNumberOfTouches;   // default is UINT_MAX. the maximum number of touches that can be down

- (CGPoint)translationInView:(UIView *)view;                        // translation in the coordinate system of the specified view
- (void)setTranslation:(CGPoint)translation inView:(UIView *)view;

- (CGPoint)velocityInView:(UIView *)view;                           // velocity of the pan in pixels/second in the coordinate system of the specified view

@end

我正在寻找与

CGPoint         _firstScreenLocation;

这不是@property,所​​以它是私有的。

我的问题是:为什么我们能看到这些私人物品?鉴于它们是“私人的”,它们如何被使用?

我想也许是为了防止我们想要对对象进行子类化,所以我尝试这样做:

#import <UIKit/UIGestureRecognizerSubclass.h>

@interface MyPanGesture : UIPanGestureRecognizer

- (CGPoint) firstLocation;

@end

@implementation MyPanGesture

- (CGPoint) firstLocation
{
    return self->_firstScreenLocation;
}

@end

但是由于链接错误而无法构建:

架构 armv7s 的未定义符号:“_OBJC_IVAR_$_UIPanGestureRecognizer._firstScreenLocation”,引用自:Gesture.o ld 中的 -[MyPanGesture firstLocation]:未找到架构 armv7s 的符号 clang:错误:链接器命令失败,退出代码为 1(使用-v 查看调用)

谁能帮助这个困惑的人?

4

2 回答 2

1

看看@package。该指令意味着只有属于同一图像的类才能访问该变量;这意味着只有 UIKit 的类可以访问 _firstScreenLocation。

于 2013-06-26T16:02:12.897 回答
0

它完全因为您所说的原因而失败,它是私有的(实际上是package,它略有不同,但它对您来说是私有的)。您可以看到它们,因为这些实例变量正在暴露给它自己的其余部分package。包是UIKit.

你无法得到它。

(旁白:公共/私人状态与是ivar还是property无关)

您应该设置一个手势识别器委托,它会在平移发生时调用方法。

UIPanGestureRecognizer

此类的客户端可以在其操作方法中查询 UIPanGestureRecognizer 对象以获取手势的当前翻译 (translationInView:) 和翻译速度 (velocityInView:)。他们可以指定应将其坐标系用于平移和速度值的视图。客户还可以将翻译重置为所需的值。

于 2013-06-26T16:07:07.777 回答