UITabBarItem
バッジの背景色を変更したいのですが、作成方法に関するリソースが見つかりません。
15 に答える
badgeColor
バッジの色の変更は、iOS 10 以降で、内の プロパティを使用してネイティブにサポートされるようになりましたUITabBarItem
。プロパティの詳細については、 Apple ドキュメントを参照してください。
例:
- スウィフト 3:
myTab.badgeColor = UIColor.blue
- 目的 C:
[myTab setBadgeColor:[UIColor blueColor]];
アプリ用にこのコードを書きましたが、iOS 7 でしかテストしていません。
for (UIView* tabBarButton in self.tabBar.subviews) {
for (UIView* badgeView in tabBarButton.subviews) {
NSString* className = NSStringFromClass([badgeView class]);
// looking for _UIBadgeView
if ([className rangeOfString:@"BadgeView"].location != NSNotFound) {
for (UIView* badgeSubview in badgeView.subviews) {
NSString* className = NSStringFromClass([badgeSubview class]);
// looking for _UIBadgeBackground
if ([className rangeOfString:@"BadgeBackground"].location != NSNotFound) {
@try {
[badgeSubview setValue:[UIImage imageNamed:@"YourCustomImage.png"] forKey:@"image"];
}
@catch (NSException *exception) {}
}
if ([badgeSubview isKindOfClass:[UILabel class]]) {
((UILabel *)badgeSubview).textColor = [UIColor greenColor];
}
}
}
}
}
バッジの背景は、色ではなく画像でのみ更新できます。何らかの方法で更新したい場合は、バッジ ラベルも公開しました。
tabBarItem.badgeValue
!を設定した後にこのコードを呼び出す必要があることに注意することが重要です。
編集: 4/14/14
上記のコードは、どこからでも呼び出されたときに iOS 7 で機能します。iOS 7.1 で動作させるには、ビュー コントローラーで呼び出します-viewWillLayoutSubviews
。
編集:12/22/14
これは、私が現在使用している更新されたスニペットです。簡単にするために、コードをカテゴリ拡張に入れました。
- (void)badgeViews:(void (^)(UIView* badgeView, UILabel* badgeLabel, UIView* badgeBackground))block {
if (block) {
for (UIView* tabBarButton in self.subviews) {
for (UIView* badgeView in tabBarButton.subviews) {
NSString* className = NSStringFromClass([badgeView class]);
if ([className rangeOfString:@"BadgeView"].location != NSNotFound) {
UILabel* badgeLabel;
UIView* badgeBackground;
for (UIView* badgeSubview in badgeView.subviews) {
NSString* className = NSStringFromClass([badgeSubview class]);
if ([badgeSubview isKindOfClass:[UILabel class]]) {
badgeLabel = (UILabel *)badgeSubview;
} else if ([className rangeOfString:@"BadgeBackground"].location != NSNotFound) {
badgeBackground = badgeSubview;
}
}
block(badgeView, badgeLabel, badgeBackground);
}
}
}
}
}
呼び出す準備ができたら、次のようになります。
[self.tabBar badgeViews:^(UIView *badgeView, UILabel *badgeLabel, UIView *badgeBackground) {
}];
編集:11/16/15
このコードで何が起こっているのかをもう少し明確にする必要がある人がいることを知りました。for ループは、パブリックにアクセスできないいくつかのビューを検索しています。ビューのクラス名に予想される名前の一部が含まれているかどうかを確認することで、Apple による危険信号を発することなく、目的のビューに確実に到達できます。すべてが配置されると、ブロックが実行され、これらのビューに簡単にアクセスできます。
このコードが将来の iOS アップデートで機能しなくなる可能性があることは注目に値します。たとえば、これらの内部ビューは、ある日、異なるクラス名を取得する可能性があります。ただし、Apple 内部でさえクラスをこの性質にリファクタリングすることはめったにないため、その可能性はほとんどありません。しかし、仮にそうしたとしても、それは のタイトルに沿ったものでありUITabBarBadgeView
、コードの期待されるポイントにまだ到達するでしょう. iOS9 は完成したばかりで、このコードはまだ意図したとおりに機能しているため、この問題が発生することはないと予想できます。
私は同じ問題を抱えており、BadgeView を簡単にカスタマイズできる UILabel に置き換える小さなカテゴリを作成することで解決しました。
Swift を使用している人々のために、バッジ ビューを任意の画面サイズと方向で動作させるために、TimWhiting の回答を改善することができました。
extension UITabBarController {
func setBadges(badgeValues: [Int]) {
for view in self.tabBar.subviews {
if view is CustomTabBadge {
view.removeFromSuperview()
}
}
for index in 0...badgeValues.count-1 {
if badgeValues[index] != 0 {
addBadge(index, value: badgeValues[index], color:UIColor(paletteItem: .Accent), font: UIFont(name: Constants.ThemeApp.regularFontName, size: 11)!)
}
}
}
func addBadge(index: Int, value: Int, color: UIColor, font: UIFont) {
let badgeView = CustomTabBadge()
badgeView.clipsToBounds = true
badgeView.textColor = UIColor.whiteColor()
badgeView.textAlignment = .Center
badgeView.font = font
badgeView.text = String(value)
badgeView.backgroundColor = color
badgeView.tag = index
tabBar.addSubview(badgeView)
self.positionBadges()
}
override public func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.positionBadges()
}
// Positioning
func positionBadges() {
var tabbarButtons = self.tabBar.subviews.filter { (view: UIView) -> Bool in
return view.userInteractionEnabled // only UITabBarButton are userInteractionEnabled
}
tabbarButtons = tabbarButtons.sort({ $0.frame.origin.x < $1.frame.origin.x })
for view in self.tabBar.subviews {
if view is CustomTabBadge {
let badgeView = view as! CustomTabBadge
self.positionBadge(badgeView, items:tabbarButtons, index: badgeView.tag)
}
}
}
func positionBadge(badgeView: UIView, items: [UIView], index: Int) {
let itemView = items[index]
let center = itemView.center
let xOffset: CGFloat = 12
let yOffset: CGFloat = -14
badgeView.frame.size = CGSizeMake(17, 17)
badgeView.center = CGPointMake(center.x + xOffset, center.y + yOffset)
badgeView.layer.cornerRadius = badgeView.bounds.width/2
tabBar.bringSubviewToFront(badgeView)
}
}
class CustomTabBadge: UILabel {}
いいえ。値のみを設定できます。Apple のドキュメント バッジから:
項目の右上隅に表示されるテキストで、周囲を赤い楕円で囲んでいます。
// change TabBar BadgeView background Color
-(void)changeTabBarBadgeViewBgColor:(UITabBar*)tabBar {
for (UIView* tabBarButton in tabBar.subviews) {
for (UIView* badgeView in tabBarButton.subviews) {
NSString* className = NSStringFromClass([badgeView class]);
// looking for _UIBadgeView
if ([className rangeOfString:@"BadgeView"].location != NSNotFound) {
for (UIView* badgeSubview in badgeView.subviews) {
NSString* className = NSStringFromClass([badgeSubview class]);
// looking for _UIBadgeBackground
if ([className rangeOfString:@"BadgeBackground"].location != NSNotFound) {
@try {
[badgeSubview setValue:nil forKey:@"image"];
[badgeSubview setBackgroundColor:[UIColor blueColor]];
badgeSubview.clipsToBounds = YES;
badgeSubview.layer.cornerRadius = badgeSubview.frame.size.height/2;
}
@catch (NSException *exception) {}
}
if ([badgeSubview isKindOfClass:[UILabel class]]) {
((UILabel *)badgeSubview).textColor = [UIColor greenColor];
}
}
}
}
}
}
はい。ただし、可能な唯一の解決策は、カスタム タブバーを作成し、カスタム タブバー バッジ アイコンを作成することです。カスタム タブバーを作成するための多くの記事/コードが見つかります。
うーん...とても簡単です。[[self tabBarItem] setBadgeColor:[UIColor greenColor]];
ここ @ UITabbarItem-CustomBadgeを見てください。
完全なデモンストレーションは次のとおりです
デフォルトの実装を使用する場合は、わずか 2 行のコードで済みます。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//supplying the animation parameter
[UITabBarItem setDefaultAnimationProvider:[[DefaultTabbarBadgeAnimation alloc] init]];
[UITabBarItem setDefaultConfigurationProvider:[[DefaultSystemLikeBadgeConfiguration alloc] init]];
//rest of your code goes following...
return YES;
}