8

キーボード拡張アプリを作成しています。ユーザーがボタンをタップすると、ボタンにキー ポップ アニメーションが追加されました。画像の内側では問題なく動作しますが、サブビューをクリップすると、一番上の行の画像ポップアップ領域が非表示になります。ClipToBound プロパティを試して、False に設定しました。しかし、まだ機能していません。誰でもこれを修正する方法を知っていますか? スーパービューにサブビューを追加しても機能しません。

画像 A は、キーボードのフレーム内にあるため、正しいポップアップを示しています。画像 B は、フレーム内のポップアップ クリップとして間違っています。

画像 A は、キーボードのフレーム内にあるため、正しいポップアップを示しています。 画像 B は、フレーム内のポップアップ クリップとして間違っています。

4

3 に答える 3

5

キーボード ビュー以外のものを表示することは許可されていないと思います。自動的にクリップされます。

https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/Keyboard.html

于 2014-10-11T05:17:49.347 に答える
4

//ポップアップ形式の画像を探している人:

// ボタンの幅などにいくつかの定数を使用しました。新しいキーボードに従って調整できます。

**#define _UPPER_WIDTH (52.0 * [[UIScreen mainScreen] スケール])

**#define _LOWER_WIDTH (32.0 * [[UIScreen mainScreen] スケール])

**#define _PAN_UPPER_RADIUS (7.0 * [[UIScreen mainScreen] スケール])

**#define _PAN_LOWER_RADIUS (7.0 * [[UIScreen mainScreen] スケール])

**#define _PAN_UPPDER_WIDTH (_UPPER_WIDTH-_PAN_UPPER_RADIUS*2)

**#define _PAN_UPPER_HEIGHT (61.0 * [[UIScreen mainScreen] スケール])

**#define _PAN_LOWER_WIDTH (_LOWER_WIDTH-_PAN_LOWER_RADIUS*2)

**#define _PAN_LOWER_HEIGHT (30.0 * [[UIScreen mainScreen] スケール])

**#define _PAN_UL_WIDTH ((_UPPER_WIDTH-_LOWER_WIDTH)/2)

**#define _PAN_MIDDLE_HEIGHT (11.0 * [[UIScreen mainScreen] スケール])

**#define _PAN_CURVE_SIZE (7.0 * [[UIScreen mainScreen] スケール])

**#define _PADDING_X (15 * [[UIScreen mainScreen] スケール])

**#define _PADDING_Y (10 * [[UIScreen mainScreen] スケール])

**#define _WIDTH (_UPPER_WIDTH + _PADDING_X*2)

**#define _HEIGHT (_PAN_UPPER_HEIGHT + _PAN_MIDDLE_HEIGHT + _PAN_LOWER_HEIGHT + _PADDING_Y*2)

**#define _OFFSET_X -25 * [[UIScreen mainScreen] スケール])

**#define _OFFSET_Y 59 * [[UIScreen mainScreen] スケール])

- (UIImage *)createKeytopImageOfType:(ButtonType)type
{

CGMutablePathRef path = CGPathCreateMutable();


CGPoint p = CGPointMake(_PADDING_X, _PADDING_Y);
CGPoint p1 = CGPointZero;
CGPoint p2 = CGPointZero;

p.x += _PAN_UPPER_RADIUS;
CGPathMoveToPoint(path, NULL, p.x, p.y);

p.x += _PAN_UPPDER_WIDTH;
CGPathAddLineToPoint(path, NULL, p.x, p.y);

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;

p.y += _PAN_UPPER_HEIGHT - _PAN_UPPER_RADIUS - _PAN_CURVE_SIZE;

CGPathAddLineToPoint(path, NULL, p.x, p.y);

p1 = CGPointMake(p.x, p.y + _PAN_CURVE_SIZE);

switch (type) 
{
    case LeftButton:
        p.x -= _PAN_UL_WIDTH*2;
        break;

    case InnerButton:
        p.x -= _PAN_UL_WIDTH;
        break;

    case RightButton:
        break;
}

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);

p.y += _PAN_LOWER_HEIGHT - _PAN_CURVE_SIZE - _PAN_LOWER_RADIUS;
CGPathAddLineToPoint(path, NULL, p.x, p.y);

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);

p.x -= _PAN_LOWER_WIDTH;
p.y += _PAN_LOWER_RADIUS;
CGPathAddLineToPoint(path, NULL, p.x, p.y);

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);

p.x -= _PAN_LOWER_RADIUS;
p.y -= _PAN_LOWER_HEIGHT - _PAN_LOWER_RADIUS - _PAN_CURVE_SIZE;
CGPathAddLineToPoint(path, NULL, p.x, p.y);

p1 = CGPointMake(p.x, p.y - _PAN_CURVE_SIZE);

switch (kind) {
    case PKNumberPadViewImageLeft:
        break;

    case PKNumberPadViewImageInner:
        p.x -= _PAN_UL_WIDTH;
        break;

    case PKNumberPadViewImageRight:
        p.x -= _PAN_UL_WIDTH*2;
        break;
}

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);

p.y -= _PAN_UPPER_HEIGHT - _PAN_UPPER_RADIUS - _PAN_CURVE_SIZE;
CGPathAddLineToPoint(path, NULL, p.x, p.y);

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,
                                       _HEIGHT));
context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0.0, _HEIGHT);
CGContextScaleCTM(context, 1.0, -1.0);

CGContextAddPath(context, path);
CGContextClip(context);

//----

// draw gradient
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();
CGFloat components[] = {
    0.95f, 1.0f,
    0.85f, 1.0f,
    0.675f, 1.0f,
    0.8f, 1.0f};

size_t count = sizeof(components)/ (sizeof(CGFloat)* 2);

CGRect frame = CGPathGetBoundingBox(path);
CGPoint startPoint = frame.origin;
CGPoint endPoint = frame.origin;
endPoint.y = frame.origin.y + frame.size.height;

CGGradientRef gradientRef =
CGGradientCreateWithColorComponents(colorSpaceRef, components, NULL, count);

CGContextDrawLinearGradient(context,
                            gradientRef,
                            startPoint,
                            endPoint,
                            kCGGradientDrawsAfterEndLocation);

CGGradientRelease(gradientRef);
CGColorSpaceRelease(colorSpaceRef);

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

UIGraphicsEndImageContext();

CFRelease(path);

return image;
}
于 2015-10-26T20:42:31.650 に答える
1

@Benは正しいです。キーボードウィンドウの外に何も表示することはできません。

ビュー階層を調べるとUIWindow、キーボード エクステンションの保持がキーボードの上に拡張されていないことがわかります。そのため、ウィンドウまでのビュー階層全体でオフclipsToBoundsにしても、ウィンドウの外に表示することはできません。

于 2014-10-16T16:47:22.933 に答える