setSelectionIndicatorImage is of wrong size for iphone 6 and iPhone 6+

前端 未结 2 1594
栀梦
栀梦 2021-02-06 08:16

I am using following method to set selection indicator for selected tab bar item. It works well for iPhone 4/4s/5/5s but not in iphone 6/6+.

[[UITabBar appearan         


        
相关标签:
2条回答
  • 2021-02-06 08:48

    Here is my auto-adjusting UITabBarController subclass. Just provide an image and it will adjust to all known iPhones and iPads. It will also update the size whenever the trait collection changes so it supports all the new iPad features and rotation.

    import UIKit
    
    class TabBarController: UITabBarController {
        override func viewWillAppear(animated: Bool) {
            super.viewWillAppear(animated)
    
            updateSelectionIndicatorImage()
        }
    
        override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
            super.traitCollectionDidChange(previousTraitCollection)
    
            updateSelectionIndicatorImage()
        }
    
        func updateSelectionIndicatorImage() {
            let width = CGRectGetWidth(tabBar.bounds) > 420 ? 420 : CGRectGetWidth(tabBar.bounds)
            var selectionImage = UIImage(named: "TabSelectionIndicator")
            let tabSize = CGSizeMake(width/5, 49)
    
            UIGraphicsBeginImageContext(tabSize)
            selectionImage?.drawInRect(CGRectMake(0, 0, tabSize.width, tabSize.height))
            selectionImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
    
            tabBar.selectionIndicatorImage = selectionImage
        }
    }
    
    0 讨论(0)
  • 2021-02-06 08:52

    EDIT: IT seems that after all this solution should work, I had some issues with cache

    UIImage *selTab = [[UIImage imageNamed:@"tabHighlight"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    CGSize tabSize = CGSizeMake(CGRectGetWidth(self.view.frame)/5, 49);
    UIGraphicsBeginImageContext(tabSize);
    [selTab drawInRect:CGRectMake(0, 0, tabSize.width, tabSize.height)];
    UIImage *reSizeImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    //
    [self.tabBar setSelectionIndicatorImage:reSizeImage];
    

    tabHiglight is a png of 82x49, I've tested with other sizes but this seems to fit best. I divide the width of the frame by the number of items I have in the tabBar - in my case 5, then I create a new UIImage of the "right" size and set it as the selectionIndicatorImage.

    0 讨论(0)
提交回复
热议问题