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也有同样的问题和问题