Ответ 1
Используйте вместо этого следующее:
[textfield setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
Я попытался подклассом 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)
Любая идея, если это ошибка, или я делаю что-то неправильно?
Используйте вместо этого следующее:
[textfield setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
В iOS 7 значение по умолчанию для contentVerticalAlignment
изменилось с "сверху" на "центр" (без документации, которую я мог видеть). В режиме "центра" iOS настраивает результат методов rectForBounds
перед их встраиванием. Вероятно, вы должны установить contentVerticalAlignment = UIControlContentVerticalAlignmentTop
при переопределении любого из методов textRectForBounds
, поэтому iOS будет использовать rect точно так, как указано.
Так как iOS7 является новым в наши дни, многие люди сталкиваются с проблемой кадрирования с iOS7.
Для всех, я просто хочу сказать, что это так просто, и нет никаких проблем с iOS7. Это просто потому, что вы не знаете, как воспользоваться преимуществами последней функции ОС, предоставляемой Apple.
@Cyupa: вам просто нужно применить автоматизацию и замаскировать свое текстовое поле.
это может быть один или несколько из следующих.
если вы примените правильную маску autosizing в текстовое поле, вы получите желаемый фрейм для своего вида (здесь текстовое поле)
Я также встретил эту проблему, пока не нашел причины, но если вы хотите иметь такое же поведение на 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;
проверьте версию системы и верните UIEdgeInsetsInsetRect(bounds, UIEdgeInsetsMake(topPadding, leftPadding, 0, 0));
вы можете проверить версию устройства как
if(([[[UIDevice currentDevice] systemVersion] floatValue]>=7.0))
{
}
Я решил проблему, используя это свойство
textField.contentVerticalAlignment =UIControlContentVerticalAlignmentCenter;
Он работает как для iOS6, так и для iOS7.
Решение Ricky работало для меня с добавлением, это значение должно быть установлено каждый раз после того, как текст заполнителя изменился. Я перезаписал setPlaceholder, чтобы сделать это.
Он заменяет необходимость перезаписывать drawPlaceholderInRect, если вам нужен другой цвет заполнителя, поэтому вертикальное выравнивание будет правильным автоматически. Конечно, это не отвечает на вопрос, почему IOS 7.0 ведет себя так, но может решить вашу фактическую проблему.
- (void) setPlaceholder: (NSString*)placeholderText {
[super setPlaceholder:placeholderText];
[self setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
}
Следует отметить, что некоторые люди препятствуют обходу публичных интерфейсов, поэтому делайте это на свой страх и риск! Смотрите также: Программно изменить цвет текста заполнителя UITextField