我正在为用户创建一种在屏幕上移动多边形并通过拖动其角顶点来更改其形状的方法。然后我需要能够在其他设备上重新绘制那些修改过的多边形 - 所以我需要能够在屏幕上获得所有多边形的所有顶点的最终位置。
这就是我目前正在做的事情:
我使用UIBezierPath
为drawRect
函数的覆盖中的每个形状绘制多边形。然后,我允许用户在CGAffineTransformMakeTranslation
函数覆盖中应用x
函数和y
和touchedMoved
坐标增量,在屏幕上拖动它们。我有初始控制点,从中绘制初始多边形(如here所述)。但是一旦在屏幕上移动路径实例,这些值就不会改变 - 所以我只能获得初始值。
Core Graphics
框架中是否有内置内容可以让我在UIBezierPath
实例中获取一组当前控制点?我试图避免手动跟踪这些点。我将考虑使用其他方式来绘制:
UIBezierPath#contains
方法谢谢你的时间!
答案 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,取决于我正在使用的操作。