UITextField - (void) drawPlaceholderInRect: (CGRect) rect возвращает другую высоту CGRect в iOS 7

Я попытался подклассом UITextField нарисовать пользовательский placehoder. В iOS 6 это работает отлично, но в iOS 7 я получил другую высоту CGRect.

Кадр UITextField (0, 0, 500, 45). Я добавил левое заполнение 20 путем переопределения - (CGRect)editingRectForBounds:(CGRect)bounds;

- (CGRect)placeholderRectForBounds:(CGRect)bounds;

- (CGRect)textRectForBounds:(CGRect)bounds;

Вызов метода ниже:

- (CGRect)makeRectFromBounds:(CGRect)bounds
              withTopPadding:(CGFloat)topPadding
              andLeftPadding:(CGFloat)leftPadding
{
    return UIEdgeInsetsInsetRect(bounds, UIEdgeInsetsMake(topPadding, leftPadding, 0, 0));

}

Поскольку я хочу другое placeHolder цвет текста, я переопределяю

- (void)drawPlaceholderInRect:(CGRect)rect

- (void)drawPlaceholderInRect:(CGRect)rect {

    [[UIColor colorWithRed:121.0/255.0
                     green:113.0/255.0
                      blue:107.0/255.0
                     alpha:1.0] setFill];

    [self printRect:rect from:__FUNCTION__];

    [[self placeholder] drawInRect:rect withFont:self.font];
}

Прямоугольник, который я печатаю, следующий:

iOS 7: -Rect (X: 0.0, Y:0.0, W:480.0, H:44.0)

iOS 6: -Rect (X: 0.0, Y:0.0, W:480.0, H:26.0)

Любая идея, если это ошибка, или я делаю что-то неправильно?

Ответ 1

Используйте вместо этого следующее:

[textfield setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];

Ответ 2

В iOS 7 значение по умолчанию для contentVerticalAlignment изменилось с "сверху" на "центр" (без документации, которую я мог видеть). В режиме "центра" iOS настраивает результат методов rectForBounds перед их встраиванием. Вероятно, вы должны установить contentVerticalAlignment = UIControlContentVerticalAlignmentTop при переопределении любого из методов textRectForBounds, поэтому iOS будет использовать rect точно так, как указано.

Ответ 3

Так как iOS7 является новым в наши дни, многие люди сталкиваются с проблемой кадрирования с iOS7.

Для всех, я просто хочу сказать, что это так просто, и нет никаких проблем с iOS7. Это просто потому, что вы не знаете, как воспользоваться преимуществами последней функции ОС, предоставляемой Apple.

@Cyupa: вам просто нужно применить автоматизацию и замаскировать свое текстовое поле.

это может быть один или несколько из следующих.

  • UIViewAutoresizingFlexibleBottomMargin
  • UIViewAutoresizingFlexibleTopMargin
  • UIViewAutoresizingFlexibleLeftMargin
  • UIViewAutoresizingFlexibleRightMargin
  • UIViewAutoresizingFlexibleHeight
  • UIViewAutoresizingFlexibleWidth

если вы примените правильную маску autosizing в текстовое поле, вы получите желаемый фрейм для своего вида (здесь текстовое поле)

Ответ 4

Я также встретил эту проблему, пока не нашел причины, но если вы хотите иметь такое же поведение на iOS6 и iOS7, вы можете попробовать следующее:

- (CGRect)textRectForBounds:(CGRect)bounds {
    CGRect rect = [super textRectForBounds:bounds];
    rect = CGRectMake(20, rect.origin.y-4, rect.size.width-20, rect.size.height);
    return rect;
}

и вам может потребоваться установить:

theLabel.contentVerticalAlignment =UIControlContentVerticalAlignmentCenter;

Ответ 5

проверьте версию системы и верните UIEdgeInsetsInsetRect(bounds, UIEdgeInsetsMake(topPadding, leftPadding, 0, 0));

вы можете проверить версию устройства как

if(([[[UIDevice currentDevice] systemVersion] floatValue]>=7.0))
{

}

Ответ 6

Я решил проблему, используя это свойство

textField.contentVerticalAlignment =UIControlContentVerticalAlignmentCenter;

Он работает как для iOS6, так и для iOS7.

Ответ 7

Решение Ricky работало для меня с добавлением, это значение должно быть установлено каждый раз после того, как текст заполнителя изменился. Я перезаписал setPlaceholder, чтобы сделать это.

Он заменяет необходимость перезаписывать drawPlaceholderInRect, если вам нужен другой цвет заполнителя, поэтому вертикальное выравнивание будет правильным автоматически. Конечно, это не отвечает на вопрос, почему IOS 7.0 ведет себя так, но может решить вашу фактическую проблему.

- (void) setPlaceholder: (NSString*)placeholderText {

    [super setPlaceholder:placeholderText];

    [self setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
}

Следует отметить, что некоторые люди препятствуют обходу публичных интерфейсов, поэтому делайте это на свой страх и риск! Смотрите также: Программно изменить цвет текста заполнителя UITextField