2013-05-03 31 views
18

テーブルビューのセルにUITextFieldがあり、テキストが長すぎるとフォントサイズを小さくしたいと思います。私はUITextFieldについて、UILabelまたはUITextViewではなく、非常に明確にしたいと思います。私がこれを言う理由は、この質問が何度かポップアップしてみて、答えがすべてUITextFieldの代わりにUILabelに基づいていたからです。たとえば、誰かが「私はUITextFieldを自己消化することができません」と尋ねました。答えは「numberOfLines1に設定されていることを確認してください」でした。私の知る限り、UITextFieldにはそのプロパティはなく、単一行のコントロールです。UITextFieldでテキストを自動縮小することができません

私が試してみました

:IBで

  • 7にシステム14.0、minFontSizeにフォントを設定し、 "合うように調整する" チェックボックスをチェック
  • コードでtableView:cellForRowAtIndexPath:
ptCell.name.font = [UIFont systemFontOfSize: 14.0]; 
ptCell.name.adjustsFontSizeToFitWidth = YES; 
ptCell.name.minimumFontSize = 7.0;

でもどちらも機能していません。それは、テキストが縮小する代わりに、テールを切り捨てるということです。

誰かが迷っていることを知っていますか?おそらくこれは、ユーザーがそれを望まないときにそれをしていると不平を言う他の質問を見たので、うまくいくはずです。

+0

あなたは属性付きの文字列を使用していますか? – HalR

+0

いいえ、私はそうではありません。私はあるはずですか?私はちょうどそれを試して、フィールドの幅を超えて入力を開始すると、それは少し縮小し、スクロールが、最初のレスポンダを辞めるとすぐ元のフォントサイズにスナップすることに気付きました。 – hvanbrug

+0

[UITextField最小フォントサイズ]の可能な複製(http://stackoverflow.com/questions/6045176/uitextfield-minimum-fontsize) – Harris

答えて

10

私が設定されているフォントのサイズで始まる必要なフォントサイズを与え、設定された最小フォントサイズを下回らないように、この方法を考え出すための出発点として@Purvaによって投稿答えを使用。 @Purvaがテキストの高さをテストしていたのに対し、私は幅を合わせる必要がありました。このメソッドは、UITextFieldのカテゴリまたはサブクラスのいずれかに配置できます。私はUITextFieldTextDidChangeNotificationもキャプチャするサブクラスにあります。この通知ハンドラから、必要に応じて新しいメソッドを呼び出し、フォントのサイズを変更します。テキストフィールドに新しいテキストを割り当てて、それがサブクラス化- (void)setText: (NSString*)textに収まるようにするときにも呼びます。いずれの場合も

、私はそれを呼び出すときに、私は、次のコードを使用しています:ここで

CGFloat requiredFontSize = self.requiredFontSize; 
    if(self.font.pointSize != requiredFontSize) 
    { 
     self.font = [self.font fontWithSize: requiredFontSize]; 
    } 

が新しいメソッドです:

- (CGFloat)requiredFontSize 
{ 
    const CGRect textBounds = [self textRectForBounds: self.frame]; 
    const CGFloat maxWidth = textBounds.size.width; 

    if(_originalFontSize == -1) _originalFontSize = self.font.pointSize; 

    UIFont* font  = self.font; 
    CGFloat fontSize = _originalFontSize; 

    BOOL found = NO; 
    do 
    { 
     if(font.pointSize != fontSize) 
     { 
      font = [font fontWithSize: fontSize]; 
     } 

     CGSize size = [self.text sizeWithFont: font]; 
     if(size.width <= maxWidth) 
     { 
      found = YES; 
      break; 
     } 

     fontSize -= 1.0; 
     if(fontSize < self.minimumFontSize) 
     { 
      fontSize = self.minimumFontSize; 
      break; 
     } 

    } while(TRUE); 

    return(fontSize); 
} 
+4

本当にうんざりするのは、この機能を手動で再作成する代わりに、UITextFieldコントロールが既に自動的にこれを実行しているはずです。 – hvanbrug

+0

これは私が探していた答えです。私が追加するのは1つだけです。私は を追加しますfontSize = self.minimumFontSize;最後の 'if'ステートメント内の 。これにより、返されるフォントサイズがminimumFontSizeより小さくなることはありません。 –

+0

良いキャッチ@MattBecker。私のコードでは、最小サイズより1ポイント小さくすることができました。私は答えを更新します(そして自分のコード) – hvanbrug

1
-(BOOL)sizeFontToFit:(NSString*)aString minSize:(float)aMinFontSize maxSize:(float)aMaxFontSize 
{ 
float fudgeFactor = 16.0; 
float fontSize = aMaxFontSize; 

self.font = [self.font fontWithSize:fontSize]; 

CGSize tallerSize = CGSizeMake(self.frame.size.width-fudgeFactor,kMaxFieldHeight); 
CGSize stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap]; 

while (stringSize.height >= self.frame.size.height) 
     { 
     if (fontSize <= aMinFontSize) // it just won't fit 
      return NO; 

     fontSize -= 1.0; 
     self.font = [self.font fontWithSize:fontSize]; 
     tallerSize = CGSizeMake(self.frame.size.width-fudgeFactor,kMaxFieldHeight); 
     stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap]; 
     } 

return YES; 
} 
+0

私はUITextFieldをサブクラス化し、このメソッドを呼び出すためのtextdidchange通知をキャッチすることをお勧めしますか?私は手動でテキストを設定するたびに?組み込み機能は正式に機能しませんか? – hvanbrug

+1

はい、uitextfield – Purva

+0

のカテゴリを作成する必要があります。私は既にサブクラスを持っていますので、そこに入れるのは意味があります。私は内部的に変更の通知をキャッチし、サイズを変更することができます。私は今それを試しているので、私はそれがどれくらいうまくいくかを見ていきます。あなたのコードが間違っていない限り、幅の代わりに高さをチェックしているように見えます。 – hvanbrug

8

私はあなたのためにadjustsFontSizeToFitWidthプロパティを設定したいと思いますUITextFieldをYESに設定し、minimumFontSizeを指定します。私のために働くが、UITextFieldをプログラムで追加する - IBの問題?

+0

ええ、私はそれもうまくいくと思っていましたが、どちらもIBではなくコードでも。私はバグ/問題があり、これがこれらの設定を処理できないことに同意する傾向があります。 – hvanbrug

+1

これは私にとって役に立ちます: 'emailAddress = [[UITextField alloc] initWithFrame:CGRectMake(15、117、247、30)]; emailAddress.delegate = self; emailAddress.textAlignment = NSTextAlignmentCenter; emailAddress.font = [UIFont fontWithName:@ "Helvetica" size:21]; emailAddress.minimumFontSize = 10.0f; emailAddress.adjustsFontSizeToFitWidth = YES; emailAddress.textColor = [UIColor whiteColor]; emailAddress.backgroundColor = [UIColor clearColor]; [scrollView addSubview:emailAddress]; ' –

+0

私はそのようなことをすることができませんでした。私がやった解決法をコードしなければならないという事実が好きではないので、私はもう一度やり直すことができます。つまり、私は手動でテキストフィールドを作成しているわけではありません。それはIBにあります。私は事実の後でコードのパラメータを設定していました。 – hvanbrug

13

私は同じ問題を抱えていました。 UITextFieldはテキストが長すぎるときにテキストを縮小するのを止めましたが、代わりにサイズが変更され、その境界の外に拡大しました。

私を助けた解決策は、指定されたUITextFieldにの幅制限を設定することでした。その後、それはもはや成長しなかった、その代わりに内部のテキストが意図したように小さくなった。 (もちろん、minFontSizeを設定して、ストーリーボードの「調整する」チェックボックスにチェックを入れてください)

私はそれが遅れていることは知っていますが、他の誰かがgoogleを使ってこの質問を見つけたら...それはちょうど助けるかもしれない。

0

iOS 7.0.4を実行しているXcode 5.0.2のStoryBoardで作成されたUITextFieldsと同じ問題がありました。私は、StoryBoard、viewDidLoad、またはviewWillAppearによって.minimumFontSizeプロパティを変更できないことを理解しましたが、は、をviewDidAppearで変更することができます。だから、次のコードは、私の問題を解決しました:

- (void) viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    self.myTextField.minimumFontSize = 4.0; 
    [self.myTextField setNeedsLayout]; 
    [self.myTextField layoutIfNeeded]; 
} 
-2

は、改行を選択することで解決することができる= IB

でクリップ
0

この問題に対する私の謙虚な解決策が....これだった(上のフォントの適切なサイズを見つけます私自身 - フレームの大きさに合わせて)私はshouldChangeCharactersInRangeのデリゲートメソッドの内部でそれを作った:replacementString:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

{ 

    // bla bla ... anything inside method you want to do 

    // reset font size of textfield 
    textField.font = [FONT_PROXY fontNormalOfSizeNormal]; 

    CGFloat widthOfText = [textField.text sizeWithAttributes:@{NSFontAttributeName:textField.font}].width; 
    CGFloat widthOfFrame = textField.frame.size.width; 

    // decrease font size until it fits (25 is constant that works for me) 
    while((widthOfFrame - 25) < widthOfText){ 
     CGFloat fontSize = textField.font.pointSize; 
     textField.font = [textField.font fontWithSize:fontSize - 0.5f]; 
     widthOfText = [textField.text sizeWithAttributes:@{NSFontAttributeName:textField.font}].width; 
     widthOfFrame = textField.frame.size.width; 
    } 


    } 
-2

ここでキャッチminimumFontSizeは比であり、0と1 :)

の間でなければならないことです完全点の
f.adjustsFontSizeToFitWidth = true 
f.minimumFontSize = 0.5 

作品:)収まるようにフォントサイズを変更する

+0

いいえ - あなたの言うとおり、*で近似された* scale *パラメータで、この非常に古いスレッドは、ストーリーボードのバグ、それは数年前に修正されたAFAIKによるものと思われます。あなたがしたことは、非常に小さいフォント*サイズ*に設定されています - このバグはもはや存在しないので、 "動作"しますが、答えはテキストも極端に小さくなります。調整していたパラメータの名前に気付かずに、* scale *を0.5に設定してください。今日は本当に完璧に賢明な解決策です。 ;) – ToolmakerSteve

0

スウィフト3.0方法:

let startFontSize = 14.0 
let minFontSize = 7.0 

func resizeFont() { 
    guard let font = self.font, let text = self.text else { 
     return 
    } 

    let textBounds = self.textRect(forBounds: self.bounds) 
    let maxWidth = textBounds.size.width 

    for fontSize in stride(from: startFontSize, through: minFontSize, by: -0.5) { 
     let size = (text as NSString).size(attributes: [NSFontAttributeName: font.withSize(CGFloat(fontSize))]) 
     self.font = font.withSize(CGFloat(fontSize)) 
     if size.width <= maxWidth { 
      break 
     } 
    } 
} 
1

(SWIFT 3.0)私にとっては、このその作業をしてみ

XCode8でテスト
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     // bla bla ... anything inside method you want to do 
     // reset font size of textfield 
     textField.font = UIFont.systemFont(ofSize: CGFloat(15.0)) 
     var widthOfText: CGFloat = textField.text!.size(attributes: [NSFontAttributeName: textField.font!]).width 
     var widthOfFrame: CGFloat = textField.frame.size.width 
     // decrease font size until it fits (25 is constant that works for me) 
     while (widthOfFrame - 25) < widthOfText { 
      let fontSize: CGFloat = textField.font!.pointSize 
      textField.font = textField.font?.withSize(CGFloat(fontSize - 0.5)) 
      widthOfText = (textField.text?.size(attributes: [NSFontAttributeName: textField.font!]).width)! 
      widthOfFrame = textField.frame.size.width 
     } 
     return true 
    } 
0

Swift 3.0.1

func getTextfield(view: UIView) -> [UITextField] { 
    var results = [UITextField]() 
    for subview in view.subviews as [UIView] { 
     if let textField = subview as? UITextField { 
      results += [textField] 
     } else { 
      results += getTextfield(view: subview) 
     } 
    } 
    return results 
} 

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    let allTextFields = getTextfield(view: self.view) 
    for textField in allTextFields 
    { 
     textField.font = UIFont.boldSystemFont(ofSize: 14) 
     var widthOfText: CGFloat = textField.text!.size(attributes: [NSFontAttributeName: textField.font!]).width 
     var widthOfFrame: CGFloat = textField.frame.size.width 
     while (widthOfFrame - 15) < widthOfText { // try here to find the value that fits your needs 
      let fontSize: CGFloat = textField.font!.pointSize 
      textField.font = textField.font?.withSize(CGFloat(fontSize - 0.5)) 
      widthOfText = (textField.text?.size(attributes: [NSFontAttributeName: textField.font!]).width)! 
      widthOfFrame = textField.frame.size.width 
     } 
    } 
} 

私はviewDidLayoutSubviewsを使ってすべてのテキストフィールドを取得し、テキストを自動縮小しました。

多分、誰かがこのコードを必要とします。

私にとっては完璧です。

コードは、このサイトにこのサイト上および

@KunalクマールからマレクManduch @からです: How to get all the textfields from a view in swift

関連する問題