web-dev-qa-db-fra.com

problème iOS 7.1 - L'image de l'icône de la barre de tabulation est automatiquement redimensionnée lorsque vous touchez et faites glisser le bouton de cet onglet

J'ai ce code

[tabBarItem1 setFinishedSelectedImage:[UIImage imageNamed:@"tab_pressed_home_icon"] withFinishedUnselectedImage:[UIImage imageNamed:@"tab_home_icon"]];

tabBarItem1.imageInsets = UIEdgeInsetsMake(8, 0, -2, 0);

qui définit une icône sur la barre d'onglets.

tout fonctionne bien jusqu'à la nuit dernière que je mette à jour Xcode 5.1

et exécutez l'application sur le simulateur ios7.1.

voici l'application enter image description here

maintenant, lorsque je tape sur la barre de tabulation, la taille de l'image de l'icône diminue et lorsque je relâche, l'image du doigt est revenue à la normale .

comme çaenter image description here

comment cela peut-il arriver? y a-t-il un moyen de le résoudre?

Merci.

22
SaintTail

Ce problème a été résolu en définissant les imageInsets de tabBarItem comme d'autres l'ont mentionné. Vous pouvez le faire dans le code ou dans Interface Builder, cela n'a pas d'importance. 

Le point important est que l'encart du haut soit BE EGAL à l'encart du bas.

23
wrightak

mon problème est similaire, l'icône de la barre de tabulation a changé sa position dans la mise à jour 7.1, ce problème est vraiment gênant, et j'ai fait une solution rapide car je dois approuver l'application. Était-ce:

tab bar soluction in nib

Ok je ne suis pas sûr que ce soit la meilleure solution, mais pour moi, ça marche.

7
Felipe FMMobile

J'abandonne, ma solution est ici:

utilisez la fonction pour redimensionner et compenser avec 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;
}

et réglez correctement l’image de barre de tabulation:

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]];

si d'autres solutions seraient une aide!

2
yuhua

Même problème ici. Également après la mise à jour vers iOS 7.1 et xcode 5.1 Ma solution: la taille de l'élément de la barre de tabulation était réglée sur 4 pour Bottom.

2
iHilas

Ma réponse est basée sur les autres postés ici - régler sur 0 tous les ImageInsets dans les éléments de la barre d'onglets:

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

Vous pouvez placer UIView au-dessus de la barre d'onglets et ajouter un UITapGestureReognizer à UIView. Lorsque je tape dessus, je détermine où il se trouve et appelle l'élément sélectionné approprié pour la barre d'onglets. Hack, mais fonctionne assez bien et vous permet de garder vos valeurs en-dessous de ce que vous voulez.

 @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];

 }

Ensuite, chaque fois que vous appuyez sur UIView, définissez l'élément sélectionné en fonction de l'endroit où l'utilisateur a touché. J'avais 3 éléments dans la barre d'onglets, alors j'ai juste fait une logique pour la coordonnée 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

    }

}

J'espère que ça aide.

1
Tope

J'y ai passé environ 3 heures! Et j'ai trouvé notre erreur. ce n'est pas un bug d'iOS.

Remarque: imageInsets ne va pas aider! parce que c'est un problème avec l'échelle de l'image. J'ai joué 2 heures avec ça! et aucun résultat. C'était une façon stupide d'essayer de résoudre le problème!

Veuillez regarder ce projet http://www.raywenderlich.com/50310/storyboards-tutorial-in-ios-7-part-2

sur ce projet Les icônes de joueurs et de gestes fonctionnent parfaitement! car il y a des icônes pour la rétine et non rétine.

si vous avez des icônes pour les deux échelles, alors pas de problème. Utilise les! tout fonctionnera bien! c'était 1-variante!

2-variante. Si vous ne possédez qu'une seule grande image et que vous souhaitez utiliser les deux à la fois, vous devez spécifier "l'échelle" de l'image redimensionnée:

(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

essayez ceci, il devrait faire l'affaire et n'affectera pas les anciennes versions 

Mettez les lignes ci-dessous dans la méthode init de tout contrôleur:

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

J'ai corrigé le même problème en utilisant cette catégorie pour UIImage qui crée une image à partir d'un UIView

+ (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}

Et ensuite, en utilisant cette méthode, vous pouvez créer une nouvelle image avec le décalage personnalisé dont vous avez besoin. (Je n'ai besoin que d'un décalage 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

Ma solution a été de diviser par 2 les points x et y, puis de le régler à gauche, à droite, en haut et en bas, respectivement.

Les encarts supérieur et inférieur sont définis dans votre code - il devrait suffire de définir simplement l'un de ceux-ci (par exemple, le haut). La compression de l'image en surbrillance peut s'expliquer par le fait que le raster a des dimensions différentes et non identique à l'image par défaut. Dans ce cas, les incrustations permettent à l'image de se redimensionner verticalement.

0
Leon Deriglazov