Iphone UITextField-(void)drawPlaceholderInRect:(CGRect)rect在iOS 7中返回不同的CGRect高度

Iphone UITextField-(void)drawPlaceholderInRect:(CGRect)rect在iOS 7中返回不同的CGRect高度,iphone,ios,objective-c,uitextfield,placeholder,Iphone,Ios,Objective C,Uitextfield,Placeholder,我试图将UITextField子类化以绘制自定义placehoder。在ios6中,这可以正常工作,但在ios7中,我得到了不同的CGRect高度 UITextField帧是(0,0500,45)。我通过重写添加了一个20的左填充 -(CGRect)编辑rectforbounds:(CGRect)bounds -(CGRect)占位符rectforbounds:(CGRect)bounds -(CGRect)textRectForBounds:(CGRect)bounds 调用下面的方法执行此操

我试图将
UITextField
子类化以绘制自定义placehoder。在
ios6
中,这可以正常工作,但在
ios7
中,我得到了不同的
CGRect
高度

UITextField
帧是
(0,0500,45)
。我通过重写添加了一个20的左填充
-(CGRect)编辑rectforbounds:(CGRect)bounds

-(CGRect)占位符rectforbounds:(CGRect)bounds

-(CGRect)textRectForBounds:(CGRect)bounds

调用下面的方法执行此操作:

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

}
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)
因为我需要不同的占位符文本颜色,所以我覆盖了

-(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];
}
我正在打印的矩形如下:

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

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

知道这是错误还是我做错了什么吗?

检查系统版本并返回
UIEdgeInsetsInsetRect(bounds,UIEdgeInsetsMake(topPadding,leftPadding,0,0))

您可以根据需要检查设备版本

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

}

我也遇到了这个问题,还没有找到原因,但是如果您希望在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;

请改用以下方法:

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

在iOS 7中,
contentVerticalAlignment
的默认值从“top”更改为“center”(我看不到任何文档)。在“中心”模式下,iOS在引入方法之前调整
rectForBounds
方法的结果。当重写任何
textRectForBounds
方法时,您可能应该设置
contentVerticalAlignment=UIControlContentVerticalAlignmentTop
,这样iOS将完全按照指定使用rect。

Ricky的解决方案为我提供了一个加法,每次更改占位符文本后都必须设置此值。我重写了setPlaceholder来做那件事

如果您需要另一种占位符颜色,它将取代覆盖DrawPlaceholdinRect的需要,因此垂直对齐将自动正确。当然,这并不能回答为什么IOS 7.0会这样的问题,但它可能会解决您的实际问题

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

    [super setPlaceholder:placeholderText];

    [self setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
}
值得一提的是,有些人不鼓励这种绕过公共接口的做法,所以请自行承担风险! 另见:

由于iOS7是当今新出现的,所以很多人都面临着iOS7的框架问题

对他们所有人来说,我只想说这很简单,iOS7没有任何问题。这只是因为你不知道如何从苹果提供的最新操作系统功能中获益

@Cyupa:您只需要应用自动调整大小并屏蔽您的文本字段

它可以是以下内容中的一个或多个

  • UIViewAutoResisingFlexibleBottomMargin
  • UIViewAutoResisingFlexibleTopMargin
  • UIViewAutoResisingFlexibleLeftMargin
  • UIViewAutoresizingFlexibleRightMargin
  • UIViewAutoResisingFlexibleHeight
  • UIViewAutoResisingFlexibleWidth

如果您对textfield应用适当的自动调整大小掩码,您将获得视图所需的帧(此处为textfield)

我使用此属性解决了这个问题

textField.contentVerticalAlignment =UIControlContentVerticalAlignmentCenter;

它同时适用于iOS6和iOS7。

是的,我知道这一点,但我不会称之为解决方案,因为操作系统返回不同的值。我正在寻找iOS 7中为什么CGRect不同的逻辑解释。无论如何,谢谢。同样,我也想知道真正的潜在问题,并避免像这样在整个代码中进行零碎的修复。Rick的建议是正确的,但我匆忙地将重点放在了问题上,而不是我对UITextField的期望。这仍然很奇怪,但它解决了我的问题,改变了占位符文本的颜色。试过了。在我的例子中,我需要它在中间,所以我将它设置为uicontrol内容垂直对齐中心,并且它仍然与顶部对齐。您可以将内容垂直对齐设置为“顶部”,然后自己将其置于textRectForBounds的中心吗?如果它是顶部对齐的,我想iOS会使用你给它的任何rect;只有在中心对齐的情况下才需要改变。@Cyupa,我面临着同样的问题。你找到工作了吗?@Roshni嗨,没有。我找不到对这种行为的合乎逻辑的、有记录的解释。解决方案是对UIDevice singleton上的systemVersion属性进行脏if检查。我对它不满意,但在我找到真正的原因之前它会起作用。不,它不起作用,我已经尝试过了,甚至很难,我不相信它真的会起作用。占位符颜色与占位符框架有什么关系?正如您自己所写:“因为我需要不同的占位符文本颜色,所以我覆盖了DrawPlaceholdinRect”。这是连接。如果不覆盖它,垂直对齐将是正确的,无论内容垂直对齐如何-至少只要不覆盖其他函数,这可能会弄乱rect(例如,左填充)。如果你认为,我对你撒谎,说它对我有用,或者我不知道我在说什么,请把这个也投反对票。哦,我明白了。很抱歉。我感到困惑,我把重点放在问题上(rect大小),而不是我首先关注的问题:更改占位符文本颜色。所以我会悬赏给你解释,我必须道歉。谢谢你的帮助。但我必须给瑞奇一个正确的答案,因为他是第一个,我也像个傻瓜一样冲了进去。谢谢你的建议,但没有效果。我很欣赏你的想法,一开始我还没有教过你。遗憾的是,这没有什么帮助。很抱歉,因为几天前我急急忙忙地处理了这个问题(不同的rect大小),而不是改变颜色并让系统对齐。但是,像这样与私有API混在一起还是很讨厌的。但我猜这是Objective-C的“功能”。这个应用商店安全吗?是的。没有问题。可以肯定的是,iOS 8I也有同样的问题和问题