UISegmentedControl に問題があります。レンダリング モードが AlwaysTemplate の画像を含む 2 つの異なるセグメントしかありません。
これが私の問題です:
実際にセグメントを指でタップすると、画像の色合いと強調表示が正しく更新されます。
ただし、選択したセグメントをプログラムで変更しようとすると、ハイライト (画像の周りの色) が変わりますが、画像の色合いは同じままで、実質的に見えなくなります。セグメントの画像の色合いは、セグメントをタップした場合にのみ更新されます。
これは、選択したインデックスを設定しようとした方法です:
[self.segmentControl setSelectedSegmentIndex:1];
// Optionally tried calling this after
[self.segmentControl sendActionsForControlEvents:UIControlEventValueChanged];
私が試してみました:
- 画像のレンダリング モードを変更する
- 選択したインデックスをプログラムで更新した後、UISegmentedControl で setValueChanged を呼び出します。
その他の情報:
- UISegmentedControl は、NavigationBar の UIBarButtonItem に存在します。それらから削除したため、これは影響を与えていないようですが、それでも正しく反応しません。
- これは、iOS 9 および iOS 10 デバイスで発生しました (テストしたバージョンのみ)。
- 選択したインデックスを設定した後、「setNeedsLayout」と「layoutIfNeeded」を呼び出してみました。運がない。
更新編集:
状態 UIControlStateNormal の UISegmentedControl の背景画像を削除したところ、色合いが正常に機能するようになりました。その状態の背景画像を設定すると、この問題が発生するようです。
注: 背景画像は CoreGraphics を使用して描画されます。
この行を削除すると、色合いは問題ありませんが、問題は解決しません。スタイリングのためにそこに画像が必要です:
[self.segmentControl setBackgroundImage:[UIImage segmentInactiveBackgroundImage] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
背景画像の描画方法は次のとおりです。
UIImage *img = [UIImage imageForSize:CGSizeMake(5, BAR_BUTTON_HEIGHT) withDrawingBlock:^{
UIBezierPath *outline = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 5, BAR_BUTTON_HEIGHT)
byRoundingCorners:UIRectCornerAllCorners
cornerRadii:BAR_BUTTON_IMAGE_CORNER_RADIUS_SIZE];
[[UIColor segmentedControlInactiveBackgroundColor] setFill];
[outline fill];
}];
img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(2, 2, 2, 2)];
return img;
また、非常に単純な背景画像を試して、それが描かれている方法であるかどうかを確認しました. どのような種類の背景画像でも、アイコンの色合いが台無しになります。これを使用しても台無しになります:
- (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
私は新しいプロジェクトを開始し、このバグを複製して他に影響がないことを確認するために必要な最小限の作業を行いました。それはまだ起こっています。これは、コードとバグを含む GIF です。