Удалить маску с невыделенных вкладок UITabBarItem Swift

Я пытаюсь реализовать UITabBarController с 2 UITabBarItems. Я добавил в раскадровку TabBarController. Я почти сделал это, но все же меня блокируют 2 важные проблемы:

1) Вот как должна выглядеть панель вкладок: введите здесь описание изображения

Не обращайте внимания на оранжевую кнопку, это не tabItem. Поэтому я помещаю 2 элемента вкладки и хочу, чтобы для обеих вкладок оставались белые изображения, даже если выбрана одна из них. Я много раз проверял с tintColor, barTintColor и безуспешно.

Также я попытался установить tabBarItem в ViewController:

override func awakeFromNib() {
    super.awakeFromNib()

    let imgHome         = UIImage(named: "btnHome")?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
    let imgProfile      = UIImage(named: "btnProfile")?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
    let imgSelectedTab  = UIImage(named: "selectedTab_imgBackground")?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)

    tabBarItem = UITabBarItem(title: nil, image: imgProfile, selectedImage: imgSelectedTab)
}

но безуспешно. Есть мысли по этому поводу?

2) Вторая проблема касается свойства selectedImage класса UITabBarItem. width изображения не помещается во вкладку. Я переключался между устройствами, и для каждого устройства выбранное изображение находится над другой вкладкой или не подходит для текущей вкладки. (Я нашел решение: иметь одно и то же изображение, но с разной шириной для каждого устройства. Но это наверняка не хорошее решение)

вторая вкладка выбранавыбрана первая вкладка

Любая помощь подойдет! Большое спасибо


person Bonnke    schedule 26.05.2015    source источник


Ответы (2)


Вам нужно изменить режим рендеринга на UIImageRenderingModeAlwaysOriginal вместо автоматического.

person Mika    schedule 26.05.2015
comment
Извините, чувак, я скопировал текст после того, как немного поигрался со свойствами renderMode ... Я использовал AlwaysOriginal, и происходит то же самое. - person Bonnke; 26.05.2015

Вот полный пример того, как я справился с обеими проблемами: https://github.com/AndreiBoariu/TabBarController

Для первой проблемы я решил использовать этот for цикл в UITabBarController классе:

for item in tabBar.items as! [UITabBarItem] {
        if let image = item.image {
            item.image = image.imageWithColor(UIColor.whiteColor()).imageWithRenderingMode(.AlwaysOriginal)
        }
    }

а вот расширение UIImage

public extension UIImage {
func imageWithColor(tintColor: UIColor) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)

    let context = UIGraphicsGetCurrentContext() as CGContextRef
    CGContextTranslateCTM(context, 0, self.size.height)
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextSetBlendMode(context, kCGBlendModeNormal)

    let rect = CGRectMake(0, 0, self.size.width, self.size.height) as CGRect
    CGContextClipToMask(context, rect, self.CGImage)
    tintColor.setFill()
    CGContextFillRect(context, rect)

    let newImage = UIGraphicsGetImageFromCurrentImageContext() as UIImage
    UIGraphicsEndImageContext()

    return newImage
}
}

Для второй проблемы проверьте код с github;)

person Bonnke    schedule 26.05.2015
comment
Пожалуйста, убедитесь, что ваши ответы здесь полные и самостоятельны. Ссылка на внешний репозиторий может, например, сломаться и требует, чтобы люди прочитали весь репозиторий. По крайней мере, дайте резюме. - person Martijn Pieters; 09.06.2015
comment
Спасибо @MartijnPieters, я обновлю свой ответ. Было довольно легко поделиться внешней ссылкой на мое репо, вместо того, чтобы писать код, потому что я должен делиться слишком подробной информацией ... Но я четко прокомментировал прямо в приложении. Спасибо еще раз. - person Bonnke; 09.06.2015
comment
Внешняя ссылка должна поддерживать ваш ответ, а не быть вашим ответом. Если на вопрос можно ответить только с помощью большего количества кода, чем может быть разумно опубликовано в ответе, его следует закрыть как слишком широкий. - person Martijn Pieters; 09.06.2015
comment
Итак, вы предлагаете публиковать подробности на github, не так ли? Таким образом, пользователь увидит подробности здесь или здесь и не будет вынужден загружать полный код. Просто хочу быть уверенным, что правильно понимаю вашу точку зрения. Спасибо - person Bonnke; 09.06.2015