2012-05-04 6 views
3

セグメント化されたコントロールがあり、最初と最後のアイテムを指定された幅(たとえば他のものよりも広い)にします。標準スタイルのsegmentedControl(つまり[[UISegmantedControl appearence] setBackgroundImage:forState:barMetrics:]が設定されていません)のsetWidth:forSegmentAtIndex:を使用すると、物事はそのまま動作します。しかし、背景画像を設定すると、セグメントの幅は変わりません。これにより 背景画像が設定されているときにUISegmentedControlセグメントの幅が設定されていません

[[UISegmentedControl appearance] setBackgroundImage:[[UIImage imageNamed:@"btn_normal.png"] stretchableImageWithLeftCapWidth:25 topCapHeight:0] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[[UISegmentedControl appearance] setBackgroundImage:[[UIImage imageNamed:@"btn_selected.png"] stretchableImageWithLeftCapWidth:25 topCapHeight:0] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 
[[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"nn.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"sn.png"] forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"ns.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 
[self.segmentedControl setContentMode:UIViewContentModeScaleToFill]; 
[self.segmentedControl setWidth:100.0 forSegmentAtIndex:0]; 
[self.segmentedControl setWidth:100.0 forSegmentAtIndex:4]; 

、自動的に等しい幅にサイズに表示されるすべての私のセグメント:

は、ここに私のコードです。
そして、ときに私はこの

[self.segmentedControl setContentMode:UIViewContentModeScaleToFill]; 
[self.segmentedControl setWidth:100.0 forSegmentAtIndex:0]; 
[self.segmentedControl setWidth:100.0 forSegmentAtIndex:4]; 

上記のすべてのサイズが正しく設定されているをコメントアウトします。
ここに私の質問です:どのように背景イメージのセグメントのサイズを設定できますか?
私はココアタッチと対物レンズ-cに新しいので、私は何かを逃しているかもしれません...
お願いします。

答えて

6

私はあなたが[UISegmentedControl外観]プロキシを使用する場合、それは"にsetWidth:forSegmentAtIndex:" 上書きされます考えるメソッド値を。だから、可能な解決策:

1)

[[UISegmentedControl appearance] setContentMode:UIViewContentModeScaleToFill]; 
[[UISegmentedControl appearance] setWidth:100.0 forSegmentAtIndex:0]; 
[[UISegmentedControl appearance] setWidth:100.0 forSegmentAtIndex:4]; 

私はそれはあなたのアプリケーション内のすべてのセグメント化された制御のための0と4つのセグメントのカスタム幅を設定しますので、これを使用することをお勧めしません。

2)

[self.segmentedControl setBackgroundImage:[[UIImage imageNamed:@"btn_normal.png"] stretchableImageWithLeftCapWidth:25 topCapHeight:0] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[self.segmentedControl setBackgroundImage:[[UIImage imageNamed:@"btn_selected.png"] stretchableImageWithLeftCapWidth:25 topCapHeight:0] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 
[self.segmentedControl setDividerImage:[UIImage imageNamed:@"nn.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[self.segmentedControl setDividerImage:[UIImage imageNamed:@"sn.png"] forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[self.segmentedControl setDividerImage:[UIImage imageNamed:@"ns.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 

アプリ内のすべてのセグメント化されたコントロールがカスタムの背景を持っている必要があることを必要とする場合、私はあなた自身のプロキシメソッドを記述することをお勧めします。このような何か:

- (UISegmentedControl *) customSegmentedControl { 
    UISegmentedControl *segmentedControl = [ [ [UISegmentedControl alloc] init] autorelease]; 

    [segmentedControl setBackgroundImage: [ [UIImage imageNamed: @"btn_normal.png"] stretchableImageWithLeftCapWidth: 25 topCapHeight: 0] forState: UIControlStateNormal barMetrics: UIBarMetricsDefault]; 
    [segmentedControl setBackgroundImage: [ [UIImage imageNamed: @"btn_selected.png"] stretchableImageWithLeftCapWidth: 25 topCapHeight: 0] forState: UIControlStateSelected barMetrics: UIBarMetricsDefault]; 
    [segmentedControl setDividerImage: [UIImage imageNamed: @"nn.png"] forLeftSegmentState: UIControlStateNormal rightSegmentState: UIControlStateNormal barMetrics: UIBarMetricsDefault]; 
    [segmentedControl setDividerImage: [UIImage imageNamed: @"sn.png"] forLeftSegmentState: UIControlStateSelected rightSegmentState: UIControlStateNormal barMetrics: UIBarMetricsDefault]; 
    [segmentedControl setDividerImage: [UIImage imageNamed: @"ns.png"] forLeftSegmentState: UIControlStateNormal rightSegmentState: UIControlStateSelected barMetrics: UIBarMetricsDefault]; 

    return segmentedControl; 
} 
+0

に基づいて、カスタムコントロールを記述することによって、これを解決し、イゴールをありがとう! しかし、私の質問は、セグメントのサイジングについてでした。 私はカスタムコントロールを書くことでこの問題を解決しました。 – voiger

+3

@voiger、イゴールは正しいです。外観インスタンスではなく実際のインスタンスに背景イメージを設定することにより、個々のセグメントの幅を設定することができます。外観を介して背景画像を適用する場合にのみ、指定された幅が無視されます。これはiOS 6.0で修正されているようですので、現在のところiOS 5.0のみが壊れています。 –

関連する問題