web-dev-qa-db-ja.com

プログラムでUIImageを作成して、UITabBarの上部の境界線の色を変更するにはどうすればよいですか?

私の理解では、上部の境界線の色を変更にする唯一の方法は、背景画像(320x49、上部にピクセルライン)を設定することです。これが唯一の方法のように思えます(間違っている場合は訂正してください)。

これを行う方法はありますかなし画像ファイルを使用しますか?たとえば、誰かがコードからUIImageを作成して、NavigationBarの下の境界線を変更するのを手伝ってくれました。

_UINavigationBar.appearance().shadowImage = UIImage.colorForNavBar(UIColor.redColor())

extension UIImage {   
    class func colorForNavBar(color: UIColor) -> UIImage {
        let rect = CGRectMake(0.0, 0.0, 1.0, 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }
}
_

このソリューションは実際にうまく機能します。下の境界線の色が変わります。

これをTabBarに適用しようとしましたが、何も変わりません。

UITabBar.appearance().shadowImage = UIImage.colorForNavBar(.redColor())

12
TIMEX

あなたはほとんどあなた自身の質問に答えました。 UITabBarで行ったのと同じことを、UINavigationBarでも行うことができます。影の画像(つまり「上部の境界線」)を変更する場合は、背景画像を変更する必要があります。 Apple から直接:

タブバーのカスタムシャドウ画像。タブバーにカスタムの背景画像がない場合、この属性は無視されます。この属性をプログラムで設定するには、shadowImageプロパティを使用します。

あなた自身の質問では、あなたはこれに気づいているようです:

上部の境界線の色を変更する唯一の方法は、背景画像(320x49、上部にピクセルライン)を設定することです。

上部に線があるのは背景画像ではないことを除いて。背景画像を任意に設定するだけで、シャドウ画像を好みに設定できます。

Xcode内で単純な「タブ付きアプリケーション」テンプレートを開くと、次の2行のコード(およびUIImage拡張コード)を追加すると、実際に機能することがわかります。

// White background with red border on top
UITabBar.appearance().backgroundImage = UIImage.colorForNavBar(.whiteColor())
UITabBar.appearance().shadowImage = UIImage.colorForNavBar(.redColor())

Tab Bar

26

これがSwift 3の解決策です:

extension UIImage {
    class func colorForNavBar(color: UIColor) -> UIImage {
        let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
        //    Or if you need a thinner border :
        //    let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 0.5)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        context!.setFillColor(color.cgColor)
        context!.fill(rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image!
    }
}

uITabBarControllerのviewDidLoadで上記のコードとともに使用されます

UITabBar.appearance().backgroundImage = UIImage.colorForNavBar(color: .white)
UITabBar.appearance().shadowImage = UIImage.colorForNavBar(color: .red)
10
Fox5150

UINavigationBar.appearance().backgroundImageに別の画像を提供する必要があります。

例えば:

UINavigationBar.appearance().backgroundImage = UIImage.colorForNavBar(.blackColor())
UINavigationBar.appearance().shadowImage = UIImage.colorForNavBar(.redColor())

enter image description here

4
eternity

通常、他の答えはそれを正しくしました-あなたは背景画像と影画像の両方を設定する必要があります。ただし、そうすると、バーの半透明性(ぼやけ)が低下します。透明な画像を設定しても、バーは半透明ではなく透明になります。

同様のニーズもありましたが、バーの半透明性を維持したかったのです。影の画像を設定する代わりに、バーをサブクラス化し、必要な色のヘアラインサブビューを配置しました。バーがサブビューをレイアウトするとき、ヘアラインのフレームをバーの幅、正確にピクセルに設定します。

私のGitHubデモプロジェクト を参照してください。

結果のスクリーンショットは次のとおりです。

Colored hairline tab bar

プロジェクトに私のサブビューを含めたら、次の行を使用して色を設定します。

if let tabBar = tabBarController?.tabBar as? ColoredHairlineTabBar {
    tabBar.hairlineColor = ... //Your color
}
2
Leo Natan

特定のサイズの画像を作成するために拡張機能は必要ありません。UIImageにはそのための完全に優れたコンストラクターがあります。

半透明のぼかしが失われるのを防ぐために、背景画像の代わりにバーの色合いを設定できます。画面スケールを使用して、元の境界線が次のようになっているように、境界線が1ピクセルであることを確認することもできます。

    let hairlineHeight = CGFloat(1) / UIScreen.main.scale
    tabBar.barTintColor = .white
    tabBar.shadowImage = UIImage(color: .black, size: CGSize(width: 1, height: hairlineHeight))
1
Kevin R

UITabBarをサブクラス化し、layoutSubviewsのビューに新しいサブレイヤーを追加するだけではどうでしょうか。

迅速な例:

override func layoutSubviews() {
    super.layoutSubviews()

    let topBorder = CALayer()

    let borderHeight: CGFloat = 2

    topBorder.borderWidth = borderHeight
    topBorder.borderColor = UIColor.redColor().CGColor
    topBorder.frame = CGRect(x: 0, y: -1, width: self.frame.width, height: borderHeight)

    self.layer.addSublayer(topBorder)
}
1
Harry Bloom