通过y坐标切割Bezier路径

时间:2016-03-03 11:44:37

标签: ios swift core-graphics uibezierpath

我有特定的UIBezierPath,示例

         override func drawInContext(ctx: CGContext) {
    if let slider = slider {
        // Clip
        let rect = bounds.insetBy(dx: bounds.width / 10, dy: bounds.height / 2.2)
        let path = UIBezierPath(roundedRect: rect, cornerRadius: 5)
        let circleRadius : CGFloat = 10
        let xCoordInset = bounds.width / 10
        let circlePath = UIBezierPath(ovalInRect: CGRectMake(xCoordInset , rect.midY - circleRadius, circleRadius * 2, circleRadius * 2))
        let circlePath1 = UIBezierPath(ovalInRect: CGRectMake(bounds.width - xCoordInset - circleRadius, rect.midY - circleRadius, circleRadius * 2, circleRadius * 2))
        let circlePath2 = UIBezierPath(ovalInRect: CGRectMake(rect.midX - circleRadius, rect.midY - circleRadius, circleRadius * 2, circleRadius * 2))

        path.appendPath(circlePath)
        path.appendPath(circlePath1)
        path.appendPath(circlePath2)

        CGContextAddPath(ctx, path.CGPath)

        CGContextSetFillColorWithColor(ctx, slider.trackTintColor.CGColor)
        CGContextFillPath(ctx)

    }
}

我想用灰色填充这个bezierPath的一半,用红色填充另一半。所以我想我需要有2个相同的图层,但是其中1个应该用y坐标切割,你能为这个动作建议一些可用的方法吗?

1 个答案:

答案 0 :(得分:0)

在填充灰色之前剪切到切割线上方的矩形。然后剪切到切割线下方的矩形并填充红色。

const char* db_dir="./.db";
const char* db_name = "node_test_0";

void mk_path(char* dest,const char* prefix,const char* db_name){
    memcpy(dest,prefix,strlen(prefix));
    dest[strlen(prefix)] = '/';
    memcpy(dest+strlen(prefix)+1,db_name,strlen(db_name));
    dest[strlen(prefix)+strlen(db_name)+1] = '\0';
    return;
}

int main() {
    DB* b_db;
    DB_ENV* dbenv;
    int ret;
    int flag = 0;
    DBT key, data;
    char* full_path = NULL;
    if((ret = mkdir(db_dir,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) != 0){
        if(errno != EEXIST){
        }
    }
    full_path = (char*)malloc(strlen(db_dir) + strlen(db_name) + 2);
    mk_path(full_path, db_dir, db_name);
    if ((ret = db_env_create(&dbenv, 0)) != 0) {
        dbenv->err(dbenv, ret, "Environment Created: %s", db_dir);
    }
    if ((ret = dbenv->open(dbenv, db_dir, DB_CREATE|DB_INIT_CDB|DB_INIT_MPOOL|DB_THREAD, 0)) != 0) {
    }

    if((ret = db_create(&b_db,dbenv,flag)) != 0){
    }

    if((ret = b_db->open(b_db, NULL, db_name, NULL, DB_BTREE, DB_THREAD|DB_CREATE,0)) != 0){

    }

    struct timeval start_time;
    struct timeval end_time;
    unsigned long e_usec;

    memset(&key, 0, sizeof(key));
    memset(&data, 0, sizeof(data));
    key.data = "fruit"; 
    key.size = sizeof("fruit"); 
    data.data = "apple"; 
    data.size = sizeof("apple");

    gettimeofday(&start_time, NULL);
    ret = b_db->put(b_db, NULL, &key, &data, 0);
    gettimeofday(&end_time, NULL);
    e_usec = ((end_time.tv_sec * 1000000) + end_time.tv_usec) - ((start_time.tv_sec * 1000000) + start_time.tv_usec);
    printf("%lu\n", e_usec);

    if (ret == 0) 
        printf("db: %s: key stored.\n", (char *)key.data); 
    else { 
        b_db->err(b_db, ret, "DB->put"); 
    }

    return 0;
}