web-dev-qa-db-ja.com

iOS 7.1の問題-タブボタンをタッチしてドラッグすると、タブバーアイコン画像が自動的にサイズ変更されます

私はこのコードを持っています

[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シミュレーターでアプリを実行します。

アプリはこちら enter image description here

タブバーをタップするとアイコン画像のサイズが小さくなり、指の画像を離すと通常に戻ります。しかし、アイコンをタップしてドラッグすると、画像は次のようになります(縮小)。

このような enter image description here

どうしてこんなことが起こるの?とにかくこれを解決する方法はありますか?

ありがとう。

22
SaintTail

この問題は、他の人が言及したようにtabBarItemのimageInsetsを設定することで解決されました。コードでこれを行うことも、Interface Builderで行うこともできますが、問題ではありません。

重要な点は、上のインセットを下のインセットと等しくすることです。

23
wrightak

次のようなコードでイメージインセットを設定しようとしたときに、iOS 7.1で同じ問題が発生しました。

[self.tabBarItem setImageInsets:UIEdgeInsetsMake(5, 0, -5, 0)];

そこで、ストーリーボードのバー項目サイズを直接使用して解決しました。

Bar Item Size menu

これが機能するには、次の方法で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)

enter image description here

11
CoderPug

私の問題は似ており、7.1アップデートでタブバーアイコンの位置が変わりました。この問題は本当に面倒で、アプリを承認する必要があるため、迅速な解決策を行いました。これでした:

tab bar soluction in nib

それが最善の解決策かどうかわかりませんが、私にとってはうまくいきます。

7
Felipe FMMobile

私はそれを放棄し、私の解決策はここにあります:

関数を使用してサイズを変更し、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]];

他の解決策が役立つ場合!

2
yuhua

ここで同じ問題。また、iOS 7.1およびxcode 5.1への更新後、私の解決策:タブバーのアイテムサイズはボトム用に4に設定されました。(サイズインスペクターで)他のすべてと同様に0に変更し、問題はなくなりました。

2
iHilas

私の答えはここに投稿された他の人に基づいています-タブバーアイテムのすべてのImageInsetsを0に設定します:

for (UITabBarItem* item in self.tabBar.items)
{
    [item setImageInsets: UIEdgeInsetsMake(0, 0, 0, 0)];
}
1
IdoT

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

    }

}

それが役に立てば幸い。

1
Tope

約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; 
}
1

これを試してください、それはトリックを行う必要があり、古いバージョンには影響しません

Anyコントローラのinitメソッドに次の行を追加します。

UIImage* image = [UIImage imageNamed: @"Your tabbar image name goes here"];
    if ([image respondsToSelector: @selector(imageWithRenderingMode:)])
            [self.tabBarItem setImage: [image imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal]];
0
Ahmad Al-Attal

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];
}
0
eold

私の解決策は、xポイントとyポイントを2で割って、それぞれ左、右、上、下に設定することでした。

上下のインセットはコード内で設定されます。これらの上に設定するだけで十分です(トップなど)。ハイライトされた画像が圧縮される理由は、ラスターのサイズがデフォルトの画像と同じではなく異なるためかもしれません。この場合、インセットは画像を垂直方向に拡大縮小します。

0
Leon Deriglazov