2012-03-12 76 views
45

我有一個奇怪的問題。我有一個UITextField,用戶應該在其中寫入一些東西,所以這個字段被稱爲「amountField」。一切看起來都很好,當用戶開始編輯文本框時,文本位於垂直和水平中心 - 這很好。編輯後(編輯時居中),UITextField中的文本向上移動

但是,當用戶結束編輯時,文本向上移動一點點。我嘗試了很多東西,沒有任何幫助...

我在下面添加屏幕截圖,所以你可以看到有什麼問題。

這就是編輯字段時的樣子 - 沒關係。

This is while editing the field - that's ok.

,這是它的外觀做編輯的時候 - 這是問題

This is the problem.

請,如果有人知道這是什麼原因我將不勝感激! :)

這裏是我的一些與amountField相關的代碼。

amountField.keyboardType = UIKeyboardTypeNumberPad; 
amountField.returnKeyType = UIReturnKeyDone; 
amountField.delegate = self; 

[amountField setFont:[UIFont fontWithName:@"Nuptial Script LT Std" size:30]]; 
amountField.borderStyle = UITextBorderStyleNone; 
UIImage *amountBg = [UIImage imageNamed:@"skin2_ipad_amountField.png"]; 
[amountField setBackground:amountBg]; 

amountField.rightView = nil; 
//amountField.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.2]; 

amountField.textAlignment = UITextAlignmentCenter; 
amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
amountField.adjustsFontSizeToFitWidth = YES; 
amountLabel.textColor = UIColorFromARGB(0x313030); //Using my own macro 

amountField.frame = CGRectMake(300, 480, 136, 32); 
amountField.center = CGPointMake(605, 439); 

PS:那些白色的角落在那裏,因爲我把背景設置爲白色0.2 alpha,沒關係。

+1

對此有何進展?看到了同樣的問題,我的文本字段 – 2012-03-14 00:27:11

+0

我很高興我不是唯一的一個,我想,我能想到的...我會立即報告任何進展,因此繼續檢查這個問題:) – 2012-03-14 08:33:49

+0

同樣與無數的一切Pro字體 – erkanyildiz 2012-07-04 16:10:50

回答

23

所以......

多小時的努力很多事情之後 - 我已經找到了問題。 在我的情況下,問題是字體。我真的不知道爲什麼,但字體的作者使字體變得怪異(領先等),底部有一個空白空間。我不知道爲什麼,但是當你編輯文本時,所有的文本屬性都會被忽略,但是在完成編輯之後,它們就會被應用。

因此,如果您有類似的問題,請嘗試將字體更改爲Arial或類似的東西。

有關完整說明,請參考以下鏈接:link 1link 2。在這些鏈接中推薦的解決方案可以避免很多令人頭痛的問題,甚至可以應用於修復在開始編輯UITextField(使用系統字體或其他特定字體)時將文本移動到頂部的問題。

+0

我也在使用自定義字體。奇怪。我的解決方案是在用戶停止更新時更新字體框架,以確保它看起來垂直居中。 – 2012-03-14 17:31:20

+0

高興聽到它幫助你:)(如果你願意,你可以投票我的答案了) 你怎麼更新字型框架?你能發佈一些代碼嗎? :)謝謝,多米尼克 – 2012-03-14 18:47:14

+5

而不是改變字體,試試這個。 http://stackoverflow.com/a/10087220/244183 – McDJ 2012-04-10 10:43:53

0

我有一個UITextfield嵌入在UITableViewCell類似的問題。這個代碼究竟位於您的項目中?我相信發生的事情是,在完成編輯特定文本字段後,它會自動發送-setNeedsDisplay,並隨後調用它的drawRect:。這可能解釋了對齊方式的轉變。在我的特定情況下,我必須使用表格視圖委託方法-willDisplayCell ...來設置內容對齊。我將不得不更多地瞭解您的設計,以便提供建議。

一個可能的解決方案是使用文本字段委託方法來設置內容對齊。

-(void)textFieldDidEndEditing:(UITextField *)textField{ 
    if (amountField == textField){ 
      amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
     } 
} 
+0

感謝您的回答:)我在工作,當我回家時會嘗試。 – 2012-03-14 08:32:42

+1

這個黑客無法使用Xcode 6.1和ios 8.1。 – 2014-12-22 15:00:00

0

我無法更改字體文件,所以當我解決了這個我在屬性保存原來的UITextField的框架和應用下面的代碼:

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    textField.frame = self.usernameFrame; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    textField.frame = CGRectOffset(self.usernameFrame, 0, 1); 
} 

這是一個有點哈克,但它得到工作完成。

+0

您提供的解決方案我們只是一個黑客,它只適用於一種字體和大小,只要你改變字體的大小和/或字體的類型,錯誤就會回來。因此,它不是解決所有情況(字體類型,字體大小和UITextField高度的組合)的解決方案,它只是一種臨時修復特定情況下的缺陷的黑客攻擊。對於這個問題的其他解決方案就像我上面提到的那樣(請參閱我的答案),在界面構建器中反編譯和修改字體和/或更改字體的類型和/或字體大小和/或UITextField的高度。 – 2014-12-24 09:47:50

2

我這個問題時,應用程序的設計是自定義字體幾乎每一次掙扎。一種選擇是修復字體(但這是太多的工作 - 至少對我來說:))。我使用的是第二個選項是子類的UITextField和重寫editingRectForBounds:和placeholderRectForBounds:方法和糾正偏差。它也應該適合你的情況。

@implementation MyTextFieldWithFixedFontPosition 

-(CGRect)editingRectForBounds:(CGRect)bounds{ 
    return CGRectOffset([self textRectForBounds:bounds], 0, 0.5); //0.5 is just example, you can adjust to any offset you like 
} 
-(CGRect)placeholderRectForBounds:(CGRect)bounds{ 
    return [self editingRectForBounds:bounds]; 
} 

@end 

我還沒有leftView或rightView測試它雖然,利用這些:)

注時要小心:這種方法是「字體依賴」,用於偏移值可爲每個字體變化和大小

+0

是的,的確如此。還應該使用字體大小計算,但不同的字體可能會有不同的偏移量 – JakubKnejzlik 2014-12-25 11:06:39

0

有iOS 8.1中毛刺及以下,我不知道他們是否會稍後解決它,但當時沒有一個獨特的解決方案,解決所有的情況下,因爲錯誤和解決方案是字體的類型,尺寸依賴。

一個該解決方案或低於這些解決方案能夠解決您的問題的組合:

  • 更改字體的大小。

  • 更改字體的類型。

  • 更改UITextField的大小。

  • 反編譯有問題的字體,修改字體的特性並重新編譯(更多解釋,請參考以下鏈接:link 1link 2)。

否則這等自給自足以下解決方案可以解決您的問題:

斯威夫特版本

import UIKit 

class CustomTextField: UITextField { 

    ... 

    override func textRectForBounds(bounds: CGRect) -> CGRect { 
     // Possible values. 
     return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0)) 
    } 

    override func editingRectForBounds(bounds: CGRect) -> CGRect { 
     // Possible values. 
     return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0)) 
    } 

    override func placeholderRectForBounds(bounds: CGRect) -> CGRect { 
     // Possible values. 
     return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0)) 
    } 

} 

該解決方案已經過測試,leftView和工程就像一個魅力。

注:此方法是「字體依賴」,用於CGRectInset值可以爲每個字體和大小而變化。

+0

您能否解釋爲什麼使用插頁並返回text/editingText/placeholder的相同框架應該修復問題?在我的大多數情況下,問題是字體在返回相同的rects時渲染不正確(移動)。 – JakubKnejzlik 2014-12-25 11:25:12

+0

@GrizzlyNetch設置insets是一個奇特的句子,意思是在UITextField中設置文本週圍的填充。在這裏,你可以找到一個單詞插入的定義:http://www.thefreedictionary.com/inset – 2014-12-25 13:18:31

+0

@格里芝加哥之後,如果它不適合你的第一槍是正常的,因爲正如我在我的答案中所說:這方法是「與字體有關」,用於CGRectInset的值可能因字體和大小而異。 – 2014-12-25 13:21:33

3

當我設置文字&成爲viewDidLoadviewWillAppear的第一響應者時,發生了這個錯誤。當我將becomeFirstResponder代碼移動到viewDidAppear時,錯誤消失了。

+1

這加@n8tr的答案也爲我解決了一些其他奇怪的問題。推薦。 – 2016-05-10 21:38:28

50

我有這樣的開始發生在的iOS 9類似的問題。基本上我有一個集合視圖單元格中的UITextField。有時當用戶完成輸入和編輯時,文本會「反彈」,然後再次下降到正確的位置。非常奇怪和煩人的故障。簡單地使這種調整解決了該問題在iOS 9,並證明是安全的在iOS 7和8:

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch 
    //...other stuff 
} 
+0

我也遇到過,我連公司名稱,用戶名,密碼都連續3個UITextField。但是我的症狀不僅僅出現在iOS 9上,還出現在iOS 8上。我懷疑它與Xcode 7.0有關嗎?在iOS 8.3,8.4模擬器上也會發生。沒有8.x設備進行測試。但是您的解決方案適用於兩個版本。這就是爲什麼我認爲它與Xcode 7或iOS 9 SDK有關。 – Wingzero 2015-10-16 07:11:35

+1

我在爲iOS 8構建Xcode 6時遇到了這個問題。在我修復它之前,我升級到了Xcode 7並開始爲iOS 9構建。然後我不再看到這個bug。 – peacetype 2015-10-17 00:37:58

+0

我在iOS 9.0.2上經歷過同樣的事情 – wasabi 2015-10-20 20:12:03

0

檢查鍵盤更改彈出的位置的看法,如果有代碼self.view.layoutIfNeeded()行刪除它,祝你好運!

0

我加入高度約束我UITextFields固定這一點。

0

這是因爲BaselineOffset的文本框得到了改變。 在UITextFieldDidEndEditing創建與NSBaselineOffset的屬性文本:0和使用attributedText會解決這個問題。

-(IBAction)txtFieldDidEndEditing:(UITextField *)sender { 
    NSDictionary *style = @{ 
          NSBaselineOffsetAttributeName: @(0) 
          }; 
    self.txtField.attributedText = [[NSAttributedString alloc] initWithString:self.txtField.text attributes:style]; 
} 
7

爲TextField禁用ClipsToBounds爲我解決了它。

+0

您的解決方案幫助了我。你能解釋它爲什麼有效嗎? – hoseokchoi 2017-05-07 14:57:38

+2

我的猜測是,由於光標比文本高,並且當您使文本字段第一響應者和剪輯到邊界被啓用時,必須重繪文本以正確適合文本和光標。我們看到的是重繪。當禁用剪輯到界限時,您不再限制文本框的垂直位置,因此不會發生重繪或更新。 @ hoseokchoi – 2017-05-08 07:58:17

+0

爲我工作.. – 2017-07-06 12:11:40

0

這些解決方案上面並沒有對me.My解決方案的工作是子類的UITextField並重寫的setText:

- (void) setText:(NSString *)text { 
    [super setText:text]; 
    [self layoutIfNeeded]; 
}