iOS 8: Расширение клавиатуры. Проблема с добавлением всплывающих клавиш

Я создаю приложение для расширения клавиатуры и добавляю анимацию нажатия клавиш на кнопку, когда пользователь нажимает на нее. Он отлично работает для внутреннего изображения, но всплывающая область изображения верхней строки становится скрытой, поскольку она обрезает подвид. Я попытался использовать свойство ClipToBound и установить значение False. Но все еще не работает. Кто-нибудь знает, как это исправить? добавление подвида в супервизор также не работает.

На изображении А показано правильное всплывающее окно, так как оно находится внутри рамки клавиатуры. Изображение B неверно, так как всплывающий клип внутри кадра.

Изображение A показывает правильное всплывающее окно, поскольку оно находится внутри рамки клавиатуры. Изображение B неверно, так как всплывающее окно находится внутри рамки.


person Muzammil    schedule 10.10.2014    source источник
comment
Как ты смог добавить всплывающую анимацию при нажатии на клавиатуру? Я также думаю, что это возможно в верхних клавишах, поскольку я вижу, что многие приложения для клавиатуры реализуют аналогичный подход, который они могут настроить вид клавиатуры, чтобы разместить больше элементов управления или параметров для своей пользовательской клавиатуры. Проверьте эту ссылку: « title = «как переключить высоту изменения выбора слова на пользовательской клавиатуре ios»> stackoverflow.com/questions/25010193/   -  person jaytrixz    schedule 24.08.2015
comment
Я добавлял пользовательский слой рисования этой формы поверх нажатой кнопки.   -  person Muzammil    schedule 28.08.2015
comment
Можете ли вы поделиться своим собственным кодом слоя рисования здесь: stackoverflow.com/questions/32179015/   -  person jaytrixz    schedule 28.08.2015
comment
Привет, можешь поделиться формой всплывающего окна?   -  person TomSawyer    schedule 15.10.2015
comment
Проверьте мой ответ ниже. Я добавил код для всплывающей формы.   -  person Muzammil    schedule 26.10.2015


Ответы (3)


Я не думаю, что вам разрешено отображать что-либо за пределами клавиатуры; он будет автоматически обрезан.

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

person Ben    schedule 11.10.2014
comment
Спасибо, Бен. Я пытался со многими возможными случаями, но не смог заставить это работать, поэтому пока я отказываюсь от этой идеи :( - person Muzammil; 11.10.2014

//Тем, кто ищет всплывающее изображение:

// Я использовал некоторые константы для ширины кнопок и т. д., вы можете настроить их в соответствии с новой клавиатурой.

**#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]])

**# определить _PAN_UPPDER_WIDTH (_UPPER_WIDTH-_PAN_UPPER_RADIUS*2)

**#define _PAN_UPPER_HEIGHT (61,0 * [масштаб [[UIScreen mainScreen]])

**# определить _PAN_LOWER_WIDTH (_LOWER_WIDTH-_PAN_LOWER_RADIUS*2)

**#define _PAN_LOWER_HEIGHT (30,0 * [масштаб [[UIScreen mainScreen]])

**# определить _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] масштаб])

**# определить _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;
}
person Muzammil    schedule 26.10.2015
comment
Большое спасибо, сэр Музаммил! :) - person jaytrixz; 27.10.2015
comment
что здесь ButtonType? Например, LeftButton, InnerButton и т. д. Что это такое? я не могу понять :( - person sudoExclaimationExclaimation; 03.02.2016
comment
@PranoyC: Форма левой, правой и внутренней кнопок различна. Поэтому мы должны определить и их. - person Muzammil; 03.02.2016
comment
@Muzammil Спасибо! Очень полезно. - person iOS Dev; 31.03.2016
comment
У меня возник вопрос по фиксированным размерам. Они не масштабируются по размерам экрана, верно? Наконец-то я заработал свой макет, используя стековые представления на всех экранах, но я пытаюсь понять, как отобразить это всплывающее окно и с хорошей шириной/высотой на разных ширинах. - person VDog; 13.03.2017
comment
@VDog Я не проверял, но он должен работать с другим экраном. Единственная проблема с верхним рядом клавиатуры. Progrmr (ниже) уже хорошо объяснил это. - person Muzammil; 13.03.2017
comment
Зачем им масштабироваться, если мы устанавливаем фиксированную ширину/высоту... это означает, что клавиши не будут соответствовать соответствующей ширине/высоте клавиш, поскольку они различаются в зависимости от размера экрана. - person VDog; 14.03.2017

@ Бен прав, вам не разрешено отображать что-либо за пределами окна клавиатуры.

Если вы изучите иерархию представлений, вы увидите, что UIWindow, удерживающий расширение клавиатуры, не выходит за пределы клавиатуры, поэтому, даже если вы отключите clipsToBounds во всей иерархии представлений до окна, вы все равно не сможете отображать за пределами окна .

person progrmr    schedule 16.10.2014