路径转换后是否可以获得UIBezierPath当前控制点?

时间:2017-03-08 21:10:26

标签: ios core-graphics uibezierpath

我正在为用户创建一种在屏幕上移动多边形并通过拖动其角顶点来更改其形状的方法。然后我需要能够在其他设备上重新绘制那些修改过的多边形 - 所以我需要能够在屏幕上获得所有多边形的所有顶点的最终位置。

这就是我目前正在做的事情:

我使用UIBezierPathdrawRect函数的覆盖中的每个形状绘制多边形。然后,我允许用户在CGAffineTransformMakeTranslation函数覆盖中应用x函数和ytouchedMoved坐标增量,在屏幕上拖动它们。我有初始控制点,从中绘制初始多边形(如here所述)。但是一旦在屏幕上移动路径实例,这些值就不会改变 - 所以我只能获得初始值。

Core Graphics框架中是否有内置内容可以让我在UIBezierPath实例中获取一组当前控制点?我试图避免手动跟踪这些点。我将考虑使用其他方式来绘制:

  • 有一种内置方法可以检测点是否位于该多边形内(例如UIBezierPath#contains方法
  • 一种轻松引入约束的方法,因此用户无法将多边形移出超视图的边界(我需要整个多边形可见)
  • 用户完成后轻松获取所有积分的方法
  • iPhone 5上的所有内容都可以低于60fps运行。

谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

由于您只是将变换应用于视图/图层,要从路径中获取变换后的控制点,只需将相同的变换应用于路径,然后获取控制点。类似的东西:

for(NSInteger i=0;i<[path elementCount];i++){
    CGPathElement element = [path elementAtIndex:n];
    // now you know the element.type and the element.points
}

目前,您正在从路径中提取点的方式是唯一可用于从输入UIBezierPath重新获取点的API。但是 - 您可能对我编写的库感兴趣,以便使Bezier路径更简单:PerformanceBezier。该库使得从路径获取点变得更加容易:

public class ItemAdapter extends ArrayAdapter<Item> {

static ArrayList<Item> objects;

public ItemAdapter(Context context, int textViewResourceId, ArrayList<Item> objects) {
    super(context, textViewResourceId, objects);
    this.objects = objects;
}

public View getView(int position, View convertView, ViewGroup parent){

    View v = convertView;

    if (v == null) {
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.phonenumber_item, null);
    }

    Item i = objects.get(position);

    if (i != null) {

        TextView ttd = (TextView) v.findViewById(R.id.toptextdata);
        TextView btd = (TextView) v.findViewById(R.id.desctext);           

        if (ttd != null){
            ttd.setText(i.getName());
        }

        if (btd != null){
            btd.setText(i.getDetails());
        }
    }
    return v;
    }
}

除了添加使路径更易于使用的功能之外,它还在现有API之上添加了一个缓存层,以使使用路径的性能大大降低。根据您在UIBezierPath方法上花费的CPU时间,这个库将会有显着的改进。我看到between 2x and 10x improvement,取决于我正在使用的操作。