为什么cornerRadius没有实现到UIBezierPath弧?

时间:2016-01-26 12:20:13

标签: ios swift uibezierpath cashapelayer

我有一个UIBezierPath弧:

public class DividerDecoration extends RecyclerView.ItemDecoration {

    private final Paint mPaint;
    private int mHeightDp;

    public DividerDecoration(Context context) {
        this(context, Color.argb((int) (255 * 0.2), 0, 0, 0), 1f);
    }

    public DividerDecoration(Context context, int color, float heightDp) {
        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(color);
        mHeightDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, heightDp, context.getResources().getDisplayMetrics());
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        int position = parent.getChildAdapterPosition(view);
        int viewType = parent.getAdapter().getItemViewType(position);
        if (viewType == MY_VIEW_TYPE) {
            outRect.set(0, 0, 0, mHeightDp);
        } else {
            outRect.setEmpty();
        }
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        for (int i = 0; i < parent.getChildCount(); i++) {
            View view = parent.getChildAt(i);
            int position = parent.getChildAdapterPosition(view);
            int viewType = parent.getAdapter().getItemViewType(position);
            if (viewType == MY_VIEW_TYPE) {
                c.drawRect(view.getLeft(), view.getBottom(), view.getRight(), view.getBottom() + mHeightDp, mPaint);
            }
        }
    }
}

后来我试图将cornerRadius设置为它:

drawLayer.path = UIBezierPath(arcCenter: <CGPoint>, radius: <CGFloat>, startAngle: <CGFloat>, endAngle: <CGFloat>, clockwise: <Bool>)

它有这样的方法,但为什么它没有实现呢???

我甚至设置了

drawLayer.cornerRadius = 10

它也没有帮助:它没有改变路径的半径。

1 个答案:

答案 0 :(得分:1)

不匹配

drawLayer.pathdrawLayer.cornerRadius是两种不同的结构。

cornerRadiusCALayer本身的属性(使其边缘变圆,如在roundRect中)。

您尝试更改的是创建后路径的半径,您无法执行此操作:

drawLayer.path.radius // does not exist

UIBezierPath(arcCenter...)是一种便捷方法,可以创建一个包含控制点的路径,而不是实际的arc对象。

<强>解决方案

如果你想要一个不同的弧,创建一个新的弧,然后根据需要改变路径,使用newR作为更新的半径:

drawLayer.path = UIBezierPath(arcCenter: aPt,
                                 radius: newR,
                             startAngle: alpha,
                               endAngle: omega,
                              clockwise: b)