26

最初のボタンに左の画像、2 番目のボタンに右の画像を使用して、次のセグメント化されたコントロールをカスタマイズしようとしています。UIAppearance を使用してこれを行うにはどうすればよいですか?

次の segmentedControl を変更したい:

ここに画像の説明を入力

以下のようなものに:

ここに画像の説明を入力

カスタム イメージを使用する理由は、ボタンの角を変更できるようにするためです。青いセグメント化されたコントロールを見ると、より正方形になっています (私の画像には独自の角があります)。

私はこのようなことを考えていましたが、役に立ちません:

UIImage *leftImage = [[UIImage imageNamed:@"leftControl.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)];
UIImage *rightImage = [[UIImage imageNamed:@"rightControl.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)];

[[UISegmentedControl appearance] setBackgroundImage:leftImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault ];
[[UISegmentedControl appearance] setBackgroundImage:rightImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
4

3 に答える 3

112

次の画像を提供する必要があります。

  • 選択されたセグメントの背景 (これには左右両方のキャップがあります)
    ここに画像の説明を入力
  • 選択されていないセグメントの背景 (これには左右両方のキャップがあります)
    ここに画像の説明を入力
  • セグメントの中央、左が選択済み、右が未選択
    ここに画像の説明を入力
  • セグメントの中央、左の未選択、右の選択
    ここに画像の説明を入力
  • 中央のセグメント、左右の両方が選択されています
    ここに画像の説明を入力
  • セグメントの中央、左と右の両方が選択されていません
    ここに画像の説明を入力

そして、次のコードを使用して設定します。

/* Unselected background */
UIImage *unselectedBackgroundImage = [[UIImage imageNamed:@"segment_background_unselected"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)];
[[UISegmentedControl appearance] setBackgroundImage:unselectedBackgroundImage
                                           forState:UIControlStateNormal
                                         barMetrics:UIBarMetricsDefault];

/* Selected background */
UIImage *selectedBackgroundImage = [[UIImage imageNamed:@"segment_background_selected"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)];
[[UISegmentedControl appearance] setBackgroundImage:selectedBackgroundImage
                                           forState:UIControlStateSelected
                                         barMetrics:UIBarMetricsDefault];

/* Image between two unselected segments */
UIImage *bothUnselectedImage = [[UIImage imageNamed:@"segment_middle_unselected"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 0, 15, 0)];
[[UISegmentedControl appearance] setDividerImage:bothUnselectedImage
                             forLeftSegmentState:UIControlStateNormal
                               rightSegmentState:UIControlStateNormal
                                      barMetrics:UIBarMetricsDefault];

/* Image between segment selected on the left and unselected on the right */
UIImage *leftSelectedImage = [[UIImage imageNamed:@"segment_middle_left_selected"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 0, 15, 0)];
[[UISegmentedControl appearance] setDividerImage:leftSelectedImage
                             forLeftSegmentState:UIControlStateSelected
                               rightSegmentState:UIControlStateNormal
                                      barMetrics:UIBarMetricsDefault];

/* Image between segment selected on the right and unselected on the left */
UIImage *rightSelectedImage = [[UIImage imageNamed:@"segment_middle_right_selected"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 0, 15, 0)];
[[UISegmentedControl appearance] setDividerImage:rightSelectedImage
                             forLeftSegmentState:UIControlStateNormal
                               rightSegmentState:UIControlStateSelected
                                      barMetrics:UIBarMetricsDefault];

画像に合わせて伸縮可能な画像のキャップ サイズを調整する必要があることに注意してください。

于 2012-09-05T01:27:08.163 に答える
4

マウリツィオの答えは、ツールバー内のセグメント化されたコントロールではうまくいきませんでした。仕切りの画像の幅が十分でなかったため、コントロールにこれらの幻の線が表示され続けました。

だから私は自分のものを作りました。Xcode に必要なすべての画像を次に示します。スタイルを変更できるように、セグメント化されたコントロール画像を作成するための Photoshop ファイルも入れました。

https://s3.amazonaws.com/iwasrobbed/stackoverflow/Custom+Segmented+Control.zip

これを AppDelegate に入れて、添付の画像を使用して、ツールバー内のすべてのセグメント化されたコントロールの外観を変更します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self customizeAppAppearance];
}

- (void)customizeAppAppearance
{
    // Toolbar
    [[UIToolbar appearance] setBackgroundImage:[[UIImage imageNamed:@"toolbar.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(22, 5, 22, 5)] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];

    // Segmented Controls within Toolbars

    // Unselected background
    UIImage *unselectedBackgroundImage = [[UIImage imageNamed:@"segmentInactive.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 15, 15, 15)];
    [[UISegmentedControl appearanceWhenContainedIn:[UIToolbar class], nil] setBackgroundImage:unselectedBackgroundImage
                                                                                     forState:UIControlStateNormal
                                                                                   barMetrics:UIBarMetricsDefault];

    // Selected background
    UIImage *selectedBackgroundImage = [[UIImage imageNamed:@"segmentActive.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 15, 15, 15)];
    [[UISegmentedControl appearanceWhenContainedIn:[UIToolbar class], nil] setBackgroundImage:selectedBackgroundImage
                                                                                     forState:UIControlStateSelected
                                                                                   barMetrics:UIBarMetricsDefault];

    // Image between two unselected segments
    UIImage *bothUnselectedImage = [[UIImage imageNamed:@"segmentBothInactive.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 10, 15, 10)];
    [[UISegmentedControl appearanceWhenContainedIn:[UIToolbar class], nil] setDividerImage:bothUnselectedImage
                                                                       forLeftSegmentState:UIControlStateNormal
                                                                         rightSegmentState:UIControlStateNormal
                                                                                barMetrics:UIBarMetricsDefault];

    // Image between segment selected on the left and unselected on the right
    UIImage *leftSelectedImage = [[UIImage imageNamed:@"segmentLeftActiveRightInactive.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 0, 15, 0)];
    [[UISegmentedControl appearanceWhenContainedIn:[UIToolbar class], nil] setDividerImage:leftSelectedImage
                                                                       forLeftSegmentState:UIControlStateSelected
                                                                         rightSegmentState:UIControlStateNormal
                                                                                barMetrics:UIBarMetricsDefault];

    // Image between segment selected on the right and unselected on the left
    UIImage *rightSelectedImage = [[UIImage imageNamed:@"segmentRightActiveLeftInactive.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 0, 15, 0)];
    [[UISegmentedControl appearanceWhenContainedIn:[UIToolbar class], nil] setDividerImage:rightSelectedImage
                                                                       forLeftSegmentState:UIControlStateNormal
                                                                         rightSegmentState:UIControlStateSelected
                                                                                barMetrics:UIBarMetricsDefault];
}
于 2013-05-29T16:24:01.707 に答える
2

すべてのセグメントの背景画像を 1 つ作成する必要があります。また、ボタンの左端だけの画像、2 つのボタンをつなぐ画像、右端の画像も作成する必要があります。それらのいくつかは、複数の状態に対して行う必要があります。だからここにあなたのイメージリストがあります:

  • 左キャップ、選択済み
  • 左キャップ、未選択
  • セグメントの背景、選択済み
  • セグメントの背景、選択解除
  • 右キャップ、選択済み
  • 右キャップ、未選択
  • 中央のキャップ、左が選択されている右が選択されていない
  • 中央キャップ、未選択のまま、右選択
  • ミドル キャップ、両方を選択
  • 真ん中のキャップ、両方とも未選択

ミドル キャップの場合は、次のように配置できます: (Apple ドキュメントからのテキスト)。

// Image between two unselected segments.
[mySegmentedControl setDividerImage:image1 forLeftSegmentState:UIControlStateNormal
              rightSegmentState:UIControlStateNormal barMetrics:barMetrics];
// Image between segment selected on the left and unselected on the right.
[mySegmentedControl setDividerImage:image1 forLeftSegmentState:UIControlStateSelected
              rightSegmentState:UIControlStateNormal barMetrics:barMetrics];
// Image between segment selected on the right and unselected on the right.
[mySegmentedControl setDividerImage:image1 forLeftSegmentState:UIControlStateNormal
              rightSegmentState:UIControlStateSelected barMetrics:barMetrics];

を使用している場合はUIAppearance、明らかにこれらのメッセージをアピアランス プロキシに送信します。

于 2012-05-12T09:58:24.507 に答える