私はこのコードを持っています
[tabBarItem1 setFinishedSelectedImage:[UIImage imageNamed:@"tab_pressed_home_icon"] withFinishedUnselectedImage:[UIImage imageNamed:@"tab_home_icon"]];
tabBarItem1.imageInsets = UIEdgeInsetsMake(8, 0, -2, 0);
タブバーにアイコンを設定します。
xcode 5.1を更新する昨夜まで、すべてがうまく動作します
ios7.1シミュレーターでアプリを実行します。
アプリはこちら
タブバーをタップするとアイコン画像のサイズが小さくなり、指の画像を離すと通常に戻ります。しかし、アイコンをタップしてドラッグすると、画像は次のようになります(縮小)。
このような
どうしてこんなことが起こるの?とにかくこれを解決する方法はありますか?
ありがとう。
この問題は、他の人が言及したようにtabBarItemのimageInsetsを設定することで解決されました。コードでこれを行うことも、Interface Builderで行うこともできますが、問題ではありません。
重要な点は、上のインセットを下のインセットと等しくすることです。
次のようなコードでイメージインセットを設定しようとしたときに、iOS 7.1で同じ問題が発生しました。
[self.tabBarItem setImageInsets:UIEdgeInsetsMake(5, 0, -5, 0)];
そこで、ストーリーボードのバー項目サイズを直接使用して解決しました。
これが機能するには、次の方法でTabBarItemの画像を割り当てる必要があることを考慮してください。
UITabBar *tabBar = self.tabBarController.tabBar;
UITabBarItem *myItem = [tabBar.items objectAtIndex:0];
[homeItem setFinishedSelectedImage:[UIImage imageNamed:@"A.png"]
withFinishedUnselectedImage:[UIImage imageNamed:@"B.png"]];
この方法の代わりに
[self.tabBarItem setFinishedSelectedImage:[UIImage imageNamed:@"A.png"]
withFinishedUnselectedImage:[UIImage imageNamed:@"B.png"]];
更新
Bar Item Sizeにアクセスするには、Tab Bar Controllerの子のシーンの下にある「Item」要素を直接選択します。 (画像1)
私の問題は似ており、7.1アップデートでタブバーアイコンの位置が変わりました。この問題は本当に面倒で、アプリを承認する必要があるため、迅速な解決策を行いました。これでした:
それが最善の解決策かどうかわかりませんが、私にとってはうまくいきます。
私はそれを放棄し、私の解決策はここにあります:
関数を使用してサイズを変更し、UIImage
でオフセットを作成します
- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize andOffSet:(CGPoint)offSet{
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(offSet.x, offSet.y, newSize.width-offSet.x, newSize.height-offSet.y)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
そして、タブバーアイテムの画像を適切に設定します:
UITabBarItem *barItem = [self.tabBarController.tabBar.items objectAtIndex:i];
CGSize size = CGSizeMake(49, 49);
CGPoint offset = CGPointMake(10, 10);
[barItem setFinishedSelectedImage:[self imageWithImage:selectedImage scaledToSize:size andOffSet:offset]
withFinishedUnselectedImage:[self imageWithImage:unSelectedImage scaledToSize:size andOffSet:offset]];
他の解決策が役立つ場合!
ここで同じ問題。また、iOS 7.1およびxcode 5.1への更新後、私の解決策:タブバーのアイテムサイズはボトム用に4に設定されました。(サイズインスペクターで)他のすべてと同様に0に変更し、問題はなくなりました。
私の答えはここに投稿された他の人に基づいています-タブバーアイテムのすべてのImageInsetsを0に設定します:
for (UITabBarItem* item in self.tabBar.items)
{
[item setImageInsets: UIEdgeInsetsMake(0, 0, 0, 0)];
}
UIViewをタブバーの上に配置し、UITapGestureReognizerをUIViewに追加できます。タップすると、それがどこにあるかを判断し、タブバーの適切な選択項目を呼び出します。ハックしますが、非常にうまく機能し、インセット値を好きなように保つことができます。
@property UIView tabBarCover;//place on top of uitabbar and give it clear color background
- (void)viewDidLoad
{
[tabBar setSelectedItem:[tabBar.items objectAtIndex:0]];
UITapGestureRecognizer *singleFingerTap =
[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(handleSingleTap:)];
[tabBarCover addGestureRecognizer:singleFingerTap];
}
その後、UIViewがタップされるたびに、ユーザーがタッチした場所に基づいて選択されたアイテムを設定します。 3つのタブバー項目があるので、X座標のロジックを実行しました。
-(void) handleSingleTap:(UITapGestureRecognizer *) recognizer
{
CGPoint location = [recognizer locationInView:[recognizer.view superview]];
//NSLog(@"tapped it %lf", location.x);
if(location.x<=105){
//1st 3rd tapped, do something
}
else if(location.x >105 && location.x<=210)
{
//do nothing, selected item stays same. this is glas
}else{
//must be in 3rd section so do that load
}
}
それが役に立てば幸い。
約3時間を費やしました!そして、私たちの間違いを見つけました。 iOSのバグではありません。
注:imageInsetsは役に立ちません!これは画像のスケールの問題だからです。私はそれで2時間プレイしました!結果なし。問題を解決するのは愚かな方法でした!
このプロジェクトをご覧ください http://www.raywenderlich.com/50310/storyboards-tutorial-in-ios-7-part-2
このプロジェクトではPlayers and Gesturesアイコンは完璧に機能します!網膜と非網膜のアイコンがあるからです。
両方のスケールのアイコンがあれば、問題ありません。それらを使用してください!すべて正常に動作します! 1バリアントでした!
2バリアント。大きな画像が1つしかなく、両方の表示に使用する場合は、サイズ変更された画像の「スケール」を指定する必要があります。
(UIImage *)thumbnailImageSize:(CGSize)size fromImage:(UIImage *)image {
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 3.00) {
_scale = 3.00;
} else if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {
_scale = 2.00;
} else
_scale = 1.00;
UIGraphicsBeginImageContextWithOptions(size, NO, _scale);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
これを試してください、それはトリックを行う必要があり、古いバージョンには影響しません
Anyコントローラのinitメソッドに次の行を追加します。
UIImage* image = [UIImage imageNamed: @"Your tabbar image name goes here"];
if ([image respondsToSelector: @selector(imageWithRenderingMode:)])
[self.tabBarItem setImage: [image imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal]];
UIViewから画像を作成するUIImageにこのカテゴリを使用して、同じ問題を修正しました
+ (UIImage *) imageWithView:(UIView *)view
{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
そして、この方法を使用して、必要なカスタムオフセットを使用して新しい画像を作成できます。 (Yオフセットのみが必要です)。
-(UIImage *) uiNewImageForTabBar: (UIImage *) i withOffsetForY: (CGFloat) offsetY
{
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, i.size.width, i.size.height+offsetY)];
[v setBackgroundColor:[UIColor clearColor]];
[v setOpaque:NO];
UIImageView *sub = [[UIImageView alloc] initWithImage:i];
[sub setY:offsetY];
[v addSubview:sub];
return [UIImage imageWithView:v];
}
私の解決策は、xポイントとyポイントを2で割って、それぞれ左、右、上、下に設定することでした。
上下のインセットはコード内で設定されます。これらの上に設定するだけで十分です(トップなど)。ハイライトされた画像が圧縮される理由は、ラスターのサイズがデフォルトの画像と同じではなく異なるためかもしれません。この場合、インセットは画像を垂直方向に拡大縮小します。