12

我试图子类UITextField来绘制自定义占位符。在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)

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

4

7 回答 7

6

请改用以下内容:

[textfield setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
于 2013-09-25T00:35:48.073 回答
4

在 iOS 7 中,默认值contentVerticalAlignment从“top”更改为“center”(我看不到任何文档)。在“中心”模式下,iOSrectForBounds在绘制方法之前会调整方法的结果。您可能应该contentVerticalAlignment = UIControlContentVerticalAlignmentTop在覆盖任何textRectForBounds方法时进行设置,以便 iOS 将完全按照指定的方式使用 rect。

于 2013-09-25T03:27:22.517 回答
2

由于iOS7现在是新的,所以很多人都面临iOS7的框架问题。

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

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

可能是以下一项或多项。

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

如果您对文本字段应用适当的自动调整掩码,您将获得所需的视图框架(此处为文本字段)

于 2013-10-01T06:07:25.293 回答
1

我也遇到了这个问题,还没找到原因,但是如果你想在 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;
于 2013-09-24T03:13:32.777 回答
0

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

textField.contentVerticalAlignment =UIControlContentVerticalAlignmentCenter;

它适用于 iOS6 和 iOS7。

于 2013-10-08T08:09:37.353 回答
0

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

您可以将设备版本检查为

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

}
于 2013-09-20T11:55:08.283 回答
-3

Ricky 的解决方案对我有用,并且每次更改占位符文本后都必须设置此值。我覆盖了 setPlaceholder 来做到这一点。

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

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

    [super setPlaceholder:placeholderText];

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

应该提到的是,有些人不鼓励这种绕过公共接口的做法,所以这样做需要您自担风险!另请参阅: 以编程方式更改 UITextField 的占位符文本颜色

于 2013-09-30T12:26:08.383 回答