2012-01-13 18 views
3

多くのラベルに解析されたXMLが埋め込まれたビューがあります。そのビューはUIScrollView内にあります。 XMLの中には、ラベルが長すぎるものがあります。 XMLコンテンツに基づいてラベルのサイズを変更しています。ラベルのサイズが変更されると、UIScrollView内のUIViewのサイズが変更されていないため、ラベルが次のラベルと重なります。私はこれに答えを見つけようと何時間もインターネットを精練してきたが、私が試したことはすべて私が探しているものを達成していない。どんな助けでも大歓迎です。内容に基づいたUIViewのサイズ変更

これは私のpopulateLabelsメソッドです。

-(void) populateLabels { 

NSString *noInfo = (@"No Information Available"); 
lblCgName.text = _Campground.campground; 
NSString *cgLoc = _Campground.street1; 
NSString *cgCity = _Campground.city; 
NSString *cgState = _Campground.state1; 
NSString *cgCountry = _Campground.country; 
NSString *cgZipPostal = _Campground.zipPostal; 
cgLoc = [[cgLoc stringByAppendingString:@", "] stringByAppendingString:cgCity]; 
cgLoc = [[cgLoc stringByAppendingString:@", "] stringByAppendingString:cgState]; 
cgLoc = [[cgLoc stringByAppendingString:@", "] stringByAppendingString:cgCountry]; 
cgLoc = [[cgLoc stringByAppendingString:@" "] stringByAppendingString:cgZipPostal]; 
lblCgLoc.text = cgLoc; 
double dRate = [_Campground.regRate1 doubleValue]; 
double dRate2 = [_Campground.regRate2 doubleValue]; 
NSString *rate = [[NSString alloc] initWithFormat:@"$%0.2f",dRate]; 
NSString *rate2 = [[NSString alloc] initWithFormat:@"$%0.2f",dRate2]; 
if ([rate2 isEqualToString:@"$0.00"]) { 
    lblRate.text = rate; 
} else { 
    rate = [[rate stringByAppendingString:@" - "] stringByAppendingString:rate2]; 
    lblRate.text = rate; 
} 
double dPaRate = [_Campground.paRate1 doubleValue]; 
double dPaRate2 = [_Campground.paRate2 doubleValue]; 
NSString *paRate = [[NSString alloc] initWithFormat:@"$%0.2f",dPaRate]; 
NSString *paRate2 = [[NSString alloc] initWithFormat:@"$%0.2f",dPaRate2]; 
if ([paRate2 isEqualToString:@"$0.00"]) { 
    lblPaRate.text = paRate; 
} else { 
    paRate = [[paRate stringByAppendingString:@" - "] stringByAppendingString:paRate2]; 
    lblPaRate.text = paRate; 
} 
lblLocal1.text = _Campground.localPhone1; 
lblLocal2.text = _Campground.localPhone2; 
lblTollFree.text = _Campground.tollFree; 
lblFax.text = _Campground.fax; 
lblEmail.text = _Campground.email; 
lblWebsite.text = _Campground.website; 
NSString *gps = _Campground.latitude; 
NSString *longitude = _Campground.longitude; 
gps = [[gps stringByAppendingString:@", "] stringByAppendingString:longitude]; 
lblGps.text = gps; 
lblHighlights.text = _Campground.highlights; 
lblHighlights.lineBreakMode = UILineBreakModeWordWrap; 
lblHighlights.numberOfLines = 0; 

//label resizing 

CGSize maximumLabelSize = CGSizeMake(296,9999); 

CGSize expectedLabelSize = [_Campground.highlights sizeWithFont:lblHighlights.font 
            constrainedToSize:maximumLabelSize 
                lineBreakMode:lblHighlights.lineBreakMode]; 

//adjust the label the the new height. 
CGRect newFrame = lblHighlights.frame; 
newFrame.size.height = expectedLabelSize.height; 
lblHighlights.frame = newFrame; 

lblTents.text = _Campground.tents; 
lblNotes.text = _Campground.notes; 
lblDirections.text = _Campground.directions; 
lblRentals.text = _Campground.rentals; 

} 
+0

http://stackoverflow.com/questions/2998336/how-to-create-a-uiscrollview-programmaticallyこれは、あなたが望む種類のビューを作成するのに役立ちます... – rishi

+0

私は感謝していますそれは私が探しているものではありません。彼らはコードでスクロールビューを作成し、それをサイズ変更しています。私は既に持っているスクロールビュー内に既に持っているビューのサイズを変更するために探しています。すべてがうまくいっていて、全部スクロールします。私は、ラベルが表示されているビューを拡張する必要があります。 – tallybear

+0

最初にすべてのラベルを作成することをお勧めします。この後は、ビューの高さを動的に計算することができます - label_height + offset_height_between_label + header_footer_offset。今、このmchの高さであなたのビューを作成し、そこにラベルを追加することができます。 – rishi

答えて

3

- (void) populateLabelsメソッドはどこにありますか?ビューコントローラ内にある場合は、サイズを変更する必要があるビューに簡単にアクセスできる必要があります。あるいは、すでに作成しようとしているラベルが、サイズ変更が必要なビューに追加されている場合は、そのスーパービューにアクセスできます。あなたはすでに必要なサイズを持っています。メソッドの最後にスーパービューのフレームサイズを設定するだけです。

最初に文字列の内容に基づいて各ラベルのサイズを調べる場合は、-sizeWithFontというNSStringメソッドを使用します。あなたが制約を指定することができ、こののいくつかのバリエーションがあります:テキスト の1ライン分の

コンピューティングメトリック - sizeWithFont: - sizeWithFont:forWidth:lineBreakMode: - sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: テキスト の複数行のためのコンピューティングメトリクス - sizeWithFont:constrainedToSize: - sizeWithFont:constrainedToSize:lineBreakMode:

UILablesは、テキストのみの1行を示していることを覚えておいてください。また、文字列が使用するサイズが返されることに注意してください。 UILabelsやUITextViewsのようなビューではパディングを追加する傾向があるので、高さを計算するときにそれを考慮する必要があります。高さを計算して各ラベルを配置したら、スーパービューが必要とするサイズを知って適切に設定する必要があります。また、どのラベルがビューの最後/最下位/最下位になるのか分からない場合(superViewのサイズはorigin.y +最後のビューのsize.heightでなければなりません)、次のようにすることができます:

CGFloat totalHeight = 0.0f; 
for (UIView *view in superView.subviews) 
    if (totalHeight < view.frame.origin.y + view.frame.size.height) totalHeight = view.frame.origin.y + view.frame.size.height; 

これは、あなたがまだそれを知らないならばあなたの身長を与えます(そして、もし必要なら幅についても同じことができます)。

+0

populateLabelsメソッドは私のCampgroundDetailsViewController.mファイルにあります。そのファイルのペン先には、ビュー内にすべてのオブジェクト(ラベル、テキストビュー、ボタンなど)があります。そのビューはスクロールビューの内部にあります。私が間違っていることはありますか? – tallybear

+0

その方法の最後に、ラベル/テキスト/ビュー/ボタン/などを保持するビューのサイズを変更するだけでなく、スクロールビューのcontentSizeを調整することもできます。 CampgroundDetailsViewControllerのクラスインスタンス変数を介して両方のビューにアクセスする必要があります。 –

+0

コンテンツに基づいてビューを動的に設定する方法を知っていますか?私はsizeToFitを使う必要があると聞いてきましたが、どうすればいいですか? – tallybear

1

本当にたくさんのラベルを使用する必要がありますか?
UITextViewまたはUIScrollViewを使用する必要があるようです。

+0

私はUITextViewの使用を検討しましたが、その問題はターゲットの人口統計にあります。私が構築しているアプリはRVers用に設計されています。私たちは現在iPhoneアプリを持っており、賞賛よりも多くの苦情を受けています。これは、 "Directions"、 "Highlights"、 "Notes"セクションにUITextViewを使用します。彼らは一度TextViewにアクセスすると、ビューをスクロールすることができないと不平を言う。 99%の苦情は、メンバーがデバイスの使用方法を知らないためです。 – tallybear

+0

UITextViewのコンテンツがUITextViewより少ない場合、スクロール可能ではありません。ここではUITextViewを使用しない理由はわかりません。しかしそれはあなた次第です。 –

+0

私は、古い人にそれを扱い、UITextViewを使うように伝えるつもりです。私は "ハイライト"ラベルをTextViewに置き換えて、それはすばらしく動作します。その後、私はビューのサイズを変更する必要はありません。私はそれを静的にして、たくさんのTextViewをロードして、心配する必要はありません。 – tallybear

1

サブビューに基づいてUIViewのサイズを変更する一般的な方法はsizeToFit です。このメソッドは自動的にUIViewのサイズを変更します。

サイズを制限する場合は、sizeThatFits:を使用する必要があります。この方法ではUIViewのサイズが自動的に変更されるのではなく、サイズが返されます。

ちょっとした注意:これらの2つの方法は、サブビューでしか考慮していないので、図面やコアテキストは考慮しません。

+0

私はscrollToViewでsizeToFitを使用しようとしましたが、何もしていません。私はscrollView内にViewを持っており、すべてがViewにあります。私は別の方法でそれをやっているべきですか? – tallybear

関連する問題