2016-01-04 177 views
1

任何人有一個想法如何爲用戶長按鍵盤上的多個表情符號圖標創建自定義視圖。自定義鍵盤 - 長按鍵盤按鈕時添加多個表情符號

enter image description here

+0

您需要繪製使用'UIBezierPath'佈局和做addSubView爲好。 – iphonic

+0

@iphonic。感謝您的指導。任何參考鏈接或示例代碼? – kb920

+0

對不起,我沒有任何示例代碼,因爲我從來沒有嘗試過。但是這是你必須做的,[看看這個](https://github.com/mindbrix/TurtleBezierPath),你可以如何繪製佈局,它看起來很簡單,需要編程和計算。祝你好運。 – iphonic

回答

-1

enter image description here

你可以找到所有的細節和一些原始的OBJ-C代碼here (gist)。代碼不完整,但足以啓動。

這裏只繪製背景圖片代碼:

- (UIImage*)hintImage { 

    CGMutablePathRef path = CGPathCreateMutable(); 

    CGPoint p = CGPointMake(__PADDING_X, __PADDING_Y); 
    CGPoint p1 = CGPointZero; 
    CGPoint p2 = CGPointZero; 
    //1 
    p.x += __PAN_UPPER_RADIUS; 
    CGPathMoveToPoint(path, NULL, p.x, p.y); 

    NSUInteger hintCount = [self.hintSymbolsList count]; 
    //!!!:magic numbers 
    self.hintAdditionalWidth = 2*(hintCount-1)*(self.frame.size.width+__GAP_X); 

    //2 
    p.x += __PAN_UPPDER_WIDTH + self.hintAdditionalWidth; 
    //!!!:+hintCount*(__PAN_LOWER_WIDTH+__GAP_X); 
    CGPathAddLineToPoint(path, NULL, p.x, p.y); 

    //3 
    p.y += __PAN_UPPER_RADIUS; 
    CGPathAddArc(path, NULL, 
       p.x, p.y, 
       __PAN_UPPER_RADIUS, 
       3.0*M_PI/2.0, 
       4.0*M_PI/2.0, 
       false); 
    p.x += __PAN_UPPER_RADIUS; 

    //4 
    p.y += __PAN_UPPER_HEIGHT - __PAN_UPPER_RADIUS; 
    if (self.hintPosition == ACHintPositionFarRight || 
     self.hintPosition == ACHintPositionRight) { 
     p.y += - 2*__PAN_UPPER_RADIUS + __PAN_CURVE_SIZE + __PAN_MIDDLE_HEIGHT; 
    } else { //ACHintPositionLeft & ACHintPositionFarLeft 
     p.y -= __PAN_CURVE_SIZE; 
    } 
    CGPathAddLineToPoint(path, NULL, p.x, p.y); 

    if (self.hintPosition == ACHintPositionFarRight || 
     self.hintPosition == ACHintPositionRight) { 
     //5.1 
     p.x -= __PAN_UPPER_RADIUS; 
     CGPathAddArc(path, NULL, 
        p.x, p.y, 
        __PAN_UPPER_RADIUS, 
        4.0*M_PI/2.0, 
        1.0*M_PI/2.0, 
        false); 
     p.y += __PAN_UPPER_RADIUS; 

     //5.2 
     p.x -= self.hintAdditionalWidth + __PAN_UL_WIDTH-2*__PAN_UPPER_RADIUS; 
     CGPathAddLineToPoint(path, NULL, p.x, p.y); 

     //5.3 
     p.y += __PAN_UPPER_RADIUS; 
     CGPathAddArc(path, NULL, 
        p.x, p.y, 
        __PAN_UPPER_RADIUS, 
        3.0*M_PI/2.0, 
        2.0*M_PI/2.0, 
        true); 
     p.x -= __PAN_UPPER_RADIUS; 
    } else { //ACHintPositionLeft & ACHintPositionFarLeft 
     //5 
     p1 = CGPointMake(p.x, p.y + __PAN_CURVE_SIZE); 
     p.x -= __PAN_UL_WIDTH; 
     p.y += __PAN_MIDDLE_HEIGHT + __PAN_CURVE_SIZE*2; 
     p2 = CGPointMake(p.x, p.y - __PAN_CURVE_SIZE); 
     CGPathAddCurveToPoint(path, NULL, 
           p1.x, p1.y, 
           p2.x, p2.y, 
           p.x, p.y); 
    } 

    //6 
    p.y += __PAN_LOWER_HEIGHT - __PAN_CURVE_SIZE - __PAN_LOWER_RADIUS; 
    CGPathAddLineToPoint(path, NULL, p.x, p.y); 
    //7 
    p.x -= __PAN_LOWER_RADIUS; 
    CGPathAddArc(path, NULL, 
       p.x, p.y, 
       __PAN_LOWER_RADIUS, 
       4.0*M_PI/2.0, 
       1.0*M_PI/2.0, 
       false); 
    //8 
    p.x -= __PAN_LOWER_WIDTH; 
    p.y += __PAN_LOWER_RADIUS; 
    CGPathAddLineToPoint(path, NULL, p.x, p.y); 
    //9 
    p.y -= __PAN_LOWER_RADIUS; 
    CGPathAddArc(path, NULL, 
       p.x, p.y, 
       __PAN_LOWER_RADIUS, 
       1.0*M_PI/2.0, 
       2.0*M_PI/2.0, 
       false); 
    //10 
    p.x -= __PAN_LOWER_RADIUS; 
    p.y -= __PAN_LOWER_HEIGHT - __PAN_LOWER_RADIUS - __PAN_CURVE_SIZE; 
    CGPathAddLineToPoint(path, NULL, p.x, p.y); 

    if (self.hintPosition == ACHintPositionFarRight || 
     self.hintPosition == ACHintPositionRight) { 
     //11 
     p1 = CGPointMake(p.x, p.y - __PAN_CURVE_SIZE); 
     p.x -= __PAN_UL_WIDTH; 
     p.y -= __PAN_MIDDLE_HEIGHT + __PAN_CURVE_SIZE*2; 
     p2 = CGPointMake(p.x, p.y + __PAN_CURVE_SIZE); 
     CGPathAddCurveToPoint(path, NULL, 
           p1.x, p1.y, 
           p2.x, p2.y, 
           p.x, p.y); 
    } else { //ACHintPositionLeft & ACHintPositionFarLeft 

     //11.1 
     p.x -= __PAN_UPPER_RADIUS; 
     CGPathAddArc(path, NULL, 
        p.x, p.y, 
        __PAN_UPPER_RADIUS, 
        4.0*M_PI/2.0, 
        3.0*M_PI/2.0, 
        true); 
     p.y -= __PAN_UPPER_RADIUS; 

     //11.2 
     p.x -= self.hintAdditionalWidth + __PAN_UL_WIDTH-2*__PAN_UPPER_RADIUS; 
     CGPathAddLineToPoint(path, NULL, p.x, p.y); 

     //11.3 
     p.y -= __PAN_UPPER_RADIUS; 
     CGPathAddArc(path, NULL, 
        p.x, p.y, 
        __PAN_UPPER_RADIUS, 
        1.0*M_PI/2.0, 
        2.0*M_PI/2.0, 
        false); 
     p.x -= __PAN_UPPER_RADIUS; 
    } 

    //12 
    p.y -= __PAN_UPPER_HEIGHT - __PAN_UPPER_RADIUS; 
    if (self.hintPosition == ACHintPositionFarRight || 
     self.hintPosition == ACHintPositionRight) { 
     p.y += __PAN_CURVE_SIZE; 
    } else { 
     p.y -= - 2*__PAN_UPPER_RADIUS + __PAN_CURVE_SIZE + __PAN_MIDDLE_HEIGHT; 
    } 
    CGPathAddLineToPoint(path, NULL, p.x, p.y); 

    //13 
    p.x += __PAN_UPPER_RADIUS; 
    CGPathAddArc(path, NULL, 
       p.x, p.y, 
       __PAN_UPPER_RADIUS, 
       2.0*M_PI/2.0, 
       3.0*M_PI/2.0, 
      false); 
    //---- 
    CGContextRef context; 
    UIGraphicsBeginImageContext(CGSizeMake(__WIDTH+self.hintAdditionalWidth, 
             __HEIGHT)); 
    context = UIGraphicsGetCurrentContext(); 
    CGContextTranslateCTM(context, 0.0, __HEIGHT); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    CGContextAddPath(context, path); 
    CGContextClip(context); 

    //---- 

    CGRect frame = CGPathGetBoundingBox(path); 
    CGColorRef backColor = [UIColor whiteColor]; 

    CGContextSetFillColorWithColor(context, backColor); 
    CGContextFillRect(context, frame); 

    CGImageRef imageRef = CGBitmapContextCreateImage(context); 

    UIImage * image = [UIImage imageWithCGImage:imageRef scale:[[UIScreen mainScreen] scale] orientation:UIImageOrientationDown]; 
    CGImageRelease(imageRef); 

    UIGraphicsEndImageContext(); 

    CFRelease(path); 

    return image; 
} 
+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/12655508) – Keiwan

+1

@Keiwan現在可以嗎? – WINSergey