2013-07-06 12 views
10

私は はばかげているUILabelのフレームを、修正するために二日間しようとしている... UILabelはIBOutletであるが、それはそれは働いていない理由 ではありません。私はプログラム的にUILabelを作成しようとしましたし、 まだ動作しませんでした。ここで私はそれを行う方法です。私のUILabelのフレームを変更できないのはなぜですか?

self.descriptionLabel.text = description; 
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; 

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 
CGFloat frameHeight = textSize.height; 
CGRect frame = self.descriptionLabel.frame; 
frame.size.height = frameHeight; 
self.descriptionLabel.frame = frame; 

CGRect bounds = self.descriptionLabel.frame; 
bounds.origin.x = self.descriptionLabel.frame.origin.x + 10.0; 
bounds.size.width = self.descriptionLabel.frame.size.width - 20.0; 
self.descriptionLabel.bounds = bounds; 
self.descriptionLabel.numberOfLines = 0; 

私はすでにIRCに尋ね、彼らは私もフレームを作成しようとしました... フレームを変更することはないだろうない理由がないことを

を教えてくれましたCGRectMakeとそれに任意の 値を与えるが、どちらかのトリックをしなかった..

誰かが問題を抱えているかもしれないことを知っていますか?

編集1:私は前と後のフレームを記録し、私は奇妙な結果だ:私はフレームを設定した後

Before: 0.000000 0.000000 0.000000 0.000000 
After: 0.000000 0.000000 0.000000 33525.000000 

高さが理にかなっている唯一の値である(私はたくさんあります目的のラベルのテキスト)。

編集2:次のようにコードを変更しました。ログには、フレーム が変更されていますが、シミュレータ上では変更されませんでした。私は、UILabelのレイヤーに赤い矢印 を追加することでそれを証明しました。

self.descriptionLabel.text = description; 
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; 

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.view.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 
CGFloat frameHeight = textSize.height; 
CGRect frame = CGRectMake(0.0, 300.0, self.view.frame.size.width, frameHeight); 
self.descriptionLabel.frame = frame; 

DDLogInfo(@"After: %f %f %f %f", self.descriptionLabel.frame.origin.x, self.descriptionLabel.frame.origin.y, self.descriptionLabel.frame.size.width, self.descriptionLabel.frame.size.height); 
// After: 0.000000 300.000000 320.000000 585.000000 

self.descriptionLabel.numberOfLines = 0; 
self.descriptionLabel.layer.borderColor = [UIColor redColor].CGColor; 
self.descriptionLabel.layer.borderWidth = 2; 

Proof

+0

前後にフレームを記録しましたか?そして、なぜあなたは境界を変更していますか(特に、異なる座標空間にあるフレームを使用して)? – Wain

+0

あなたが提案したように前後にフレームを記録しました。私が編集した質問に含まれる奇妙な結果が得られました。 –

+1

なぜ最後の行数を0に設定していますか? – Abizern

答えて

26

自動レイアウトを使用している場合は、フレームの設定を行わないでください。自動レイアウトをオフにするか、制約を使用してラベルのサイズを変更してください。これを行う最も簡単な方法は、IBに高さ制約(一定の幅が必要な場合は幅)を指定し、IBOutletを作成することです。次に、コードで、sizeWithFont:constrainedToSize:lineBreakMode:から取得した値に基づいて、その制約の定数値を変更します。

+0

それは働いた!!本当にありがとう!! –

+0

うまくいった。制約を更新する方法は明らかではありません。これはあなたのやり方です:self.labelWidthContraint.constant = size.width; self.labelHeightContraint.constant = size.height; – ddiego

+0

正確に直感的ではありませんが、これはうまく機能しました.Delmar氏に感謝します! – BonanzaDriver

0

あなたのラベルは、あなたがこれを行うと、そもそもゼロフレームを持っているので:

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 

あなたが効果的に不可能な何かをするsizeWithFont方法を求めている - 教えて幅が許されていないときに必要な高さです。それが提供する応答(33525.000000)は、1文字が各行またはそのようなものに許可されている場合、おそらく高さです。

したがって、開始する前にラベルの幅を設定するか、sizeWithFontメソッドに許容幅を指定して、レスポンス(高さだけでなく)を使用してラベルサイズを設定します。

また、境界を変更することで何をしようとしているのかを検討してください。あなたが少なくともフレームを取得するまでコードをコメントアウトしてから、それを元に戻して実際にあなたが望むものをチェックすることができます。

+0

最新の編集をご覧ください。私はあなたの提案に従いましたが、フレームではフレームが変更されましたが、シミュレータでは何もしませんでした... –

+0

これはラベルに何もしていない唯一のコードです。そのコードはどこにありますか(どのメソッドがいつ呼び出されます)?自動サイズ変更/自動レイアウトルールには何がありますか? – Wain

+0

IBからUILabelを追加しましたが、私は自動レイアウト制約に触れていませんでした。ここにこのコードが入っている完全なファイルがあります:https://gist.github.com/AzizLight/40b66b2daa2917952d6f UILabelは 'viewDidLoad'で設定されています。それはそれについてです... –

関連する問題