【问题标题】:How do I determine the origin of a CGPath?如何确定 CGPath 的来源?
【发布时间】:2011-11-02 18:52:52
【问题描述】:

我在CGPath 中绘制文本,为了对文本进行命中测试,我使用CTFrameGetLineOrigins。文档是这样说的:

每个 CGPoint 是 CTFrameGetLines 返回的行数组中相应行的原点,相对于框架路径的原点。

我将如何找到框架路径的原点?我发现的示例都在最初创建路径时保存了路径的原点。我有两个问题:

  1. 我的路径的创建与我进行命中测试的地方相距甚远。除了CGPath 之外,我还需要确保传递CGPoint。丑陋,但并非不可克服。
  2. 非矩形形状的原点是什么?圆形 CGPath 的起源是什么?

【问题讨论】:

    标签: core-graphics core-foundation core-text cgpath ctframe


    【解决方案1】:

    您可以使用CGPathApply 来检查完整路径:

    typedef struct {
      CGPoint origin;
      BOOL found;
    } MySearchData;
    
    void MyApplierFunction (void* info, const CGPathElement* element) {
      MySearchData* searchData = (MySearchData *) info;
      if (! searchData->found) {
        searchData->origin = element->points[0];
        searchData->found = YES;
      }
    }
    
    CGPoint GetPathOrigin (CGPathRef path) {
      MySearchData searchData = { CGPointZero, NO };
      CGPathApply(path, (void *) &searchData, &MyApplierFunction);
      return searchData.origin;
    }
    

    【讨论】:

    • 它当然适用于矩形 CGPath。这也适用于其他形状吗?它似乎取决于首先获取左下角路径元素..
    • 我认为您无法假设第一个点相对于原始形状的位置,因此您可能需要遍历所有点以找到您正在寻找的“角落” .
    猜你喜欢
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多