Подтвердить что ты не робот

IOS 7.1 - изображение значка в Tabbar автоматически изменяется при нажатии и перетаскивании на эту вкладку

У меня есть этот код

[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

как это может произойти? есть все равно, чтобы решить это?

Спасибо.

4b9b3361

Ответ 1

Эта проблема была решена путем установки imageInsets tabBarItem, как упомянули другие. Вы можете сделать это в коде, или вы можете сделать это в Interface Builder, это не имеет значения.

Важным моментом является наличие верхней вставки BE EQUAL для нижней вставки.

Ответ 2

У меня была такая же проблема на 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"]];

Обновление

Чтобы получить доступ к размеру элемента панели, выберите непосредственно элемент "Элемент" в разделе "Сцена любого дочернего элемента вашего панели управления панелью". (Image1)

enter image description here

Ответ 3

моя проблема аналогична, значок вкладки изменил ее положение в обновлении 7.1, эта проблема действительно раздражает, и я сделал быстрое решение, потому что я должен одобрить приложение. Было ли это:

tab bar soluction in nib

Хорошо, я не уверен, что это лучшее решение, но для меня работает.

Ответ 4

Такая же проблема. Также после обновления до iOS 7.1 и xcode 5.1 Мое решение: размер элемента панели вкладок был установлен на 4 для Bottom. (В инспекторе размеров) я изменил его на 0, как и все остальные, и проблема исчезла.

Ответ 5

Я отказываюсь, мое решение здесь:

используйте функцию для изменения размера и смещения с помощью 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]];

если любые другие решения помогут!

Ответ 6

Вы можете поместить UIView поверх панели вкладок и добавить UITapGestureReognizer в UIView. Когда используется, я определяю, где он находится, и вызывается соответствующий выбранный элемент для вкладки. Hack, но работает довольно хорошо и позволяет вам сохранять свои вставки ценности, что вы хотите.

 @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

    }

}

Надеюсь, что это поможет.

Ответ 7

Я потратил около 3 часов! И я нашел свою ошибку. это не ошибка iOS.

Примечание: imageInsets не поможет! потому что это проблема с масштабом изображения. Я сыграл с ним 2 часа! и никакого результата. это был глупый способ решить проблему!

Посмотрите этот проект http://www.raywenderlich.com/50310/storyboards-tutorial-in-ios-7-part-2

на этом проекте значки "Игры и жесты" отлично работают! потому что есть значки для сетчатки и не сетчатки.

если у вас есть значки для обоих масштабов, то нет проблем. используй их! все будет нормально работать! это был 1-вариант!

2-варианта. если у вас есть только одно большое изображение, и вы хотите использовать его для отображения, вам нужно указать "масштаб" измененного изображения:

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

Ответ 8

Мой ответ основан на других, размещенных здесь - установка 0 всех ImageInsets в пунктах панели вкладок:

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

Ответ 9

попробуйте это, он должен сделать трюк и не повлияет на более старые версии

Поместите приведенные ниже строки в любой метод инициализации контроллера:

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

Ответ 10

В вашем коде установлены верхние и нижние вставки - этого должно быть достаточно, чтобы просто установить их (скажем, верх). Причина, по которой сжатый снимок будет сжат, может заключаться в том, что растр имеет разные размеры, не то же самое, что и изображение по умолчанию - в этом случае вставки делают масштаб изображения вертикальным.

Ответ 11

Я исправил ту же проблему, используя эту категорию для UIImage, которые создают изображение из UIView

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