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]()
как это может произойти?
есть все равно, чтобы решить это?
Спасибо.
Ответы
Ответ 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];
}