iOS 7.1问题 - 触摸并拖动该选项卡按钮时,Tabbar图标图像会自动调整大小

时间:2014-03-13 03:33:14

标签: ios uitabbarcontroller uitabbaritem

我有这段代码

[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

怎么会发生这种情况? 无论如何要解决这个问题?

感谢。

12 个答案:

答案 0 :(得分:23)

通过像其他人提到的那样设置tabBarItem的imageInsets来解决此问题。您可以在代码中执行此操作,也可以在Interface Builder中执行此操作,但这并不重要。

重要的一点是让顶部插入BE EQUAL到底部插入。

答案 1 :(得分:11)

在尝试使用以下代码设置Image insets时,我在iOS 7.1上遇到了同样的问题:

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

所以我直接使用故事板上的Bar Item Size解决了这个问题。

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

<强>更新

要访问条形图尺寸,请直接选择&#39;项目&#39;任何Tab Bar Controller的孩子的场景下的元素。 (图1)

enter image description here

答案 2 :(得分:7)

我的问题类似,tabbar图标在7.1更新中改变了它的位置,这个问题真的很烦人,我做了一个快速的解决方案,因为我必须批准该应用程序。是这样的:

tab bar soluction in nib

好的我不确定这是最好的解决方案,但对我来说很有效。

答案 3 :(得分:2)

这里的问题相同。此外,在更新到iOS 7.1和xcode 5.1之后我的解决方案:标签栏项目大小设置为4(对于底部。)(在大小检查器中)我将其更改为0,就像所有其他人一样,问题就消失了。

答案 4 :(得分:2)

我放弃了,我的解决方案在这里:

使用该函数调整大小并使用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]];

如果有任何其他解决方案可以提供帮助!

答案 5 :(得分:1)

您可以在标签栏的顶部放置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

    }

}

希望它有所帮助。

答案 6 :(得分:1)

我花了大约3个小时的时间!而且我发现了我们的错误。它不是iOS的错误。

注意:imageInsets无济于事!因为这是图像规模的问题。我玩了2个小时!没有结果。尝试解决问题是愚蠢的方法!

请查看此项目http://www.raywenderlich.com/50310/storyboards-tutorial-in-ios-7-part-2

在这个项目上玩家和手势图标完美无缺!因为有视网膜和非视网膜的图标。

如果你有两个尺度的图标,那么没问题。使用它们!一切都会好起来的!这是1变种!

2变的。如果您只有一个大图像,并且您想要同时使用这两个显示,那么您需要指定&#34; scale&#34;已调整大小的图片:

(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; 
}

答案 7 :(得分:1)

我的回答基于此处发布的其他人 - 在标签栏项目中设置为0所有ImageInsets:

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

答案 8 :(得分:0)

试试这个应该做的伎俩并且不会影响旧版本

将以下行放在任何控制器初始化方法中:

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

答案 9 :(得分:0)

在您的代码中设置了顶部和底部插图 - 它应该足以设置这些(例如,顶部)。突出显示的图像被压缩的原因可能是栅格具有不同的尺寸,与默认图像不同 - 在这种情况下,插图会使图像垂直缩放。

答案 10 :(得分:0)

我通过将此类别用于从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];
}

答案 11 :(得分:0)

我的解决方案是将x和y点除以2,然后分别将其设置为左,右,上和下。