私の理解では、上部の境界線の色を変更にする唯一の方法は、背景画像(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())
あなたはほとんどあなた自身の質問に答えました。 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())
これが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)
通常、他の答えはそれを正しくしました-あなたは背景画像と影画像の両方を設定する必要があります。ただし、そうすると、バーの半透明性(ぼやけ)が低下します。透明な画像を設定しても、バーは半透明ではなく透明になります。
同様のニーズもありましたが、バーの半透明性を維持したかったのです。影の画像を設定する代わりに、バーをサブクラス化し、必要な色のヘアラインサブビューを配置しました。バーがサブビューをレイアウトするとき、ヘアラインのフレームをバーの幅、正確にピクセルに設定します。
私のGitHubデモプロジェクト を参照してください。
結果のスクリーンショットは次のとおりです。
プロジェクトに私のサブビューを含めたら、次の行を使用して色を設定します。
if let tabBar = tabBarController?.tabBar as? ColoredHairlineTabBar {
tabBar.hairlineColor = ... //Your color
}
特定のサイズの画像を作成するために拡張機能は必要ありません。UIImageにはそのための完全に優れたコンストラクターがあります。
半透明のぼかしが失われるのを防ぐために、背景画像の代わりにバーの色合いを設定できます。画面スケールを使用して、元の境界線が次のようになっているように、境界線が1ピクセルであることを確認することもできます。
let hairlineHeight = CGFloat(1) / UIScreen.main.scale
tabBar.barTintColor = .white
tabBar.shadowImage = UIImage(color: .black, size: CGSize(width: 1, height: hairlineHeight))
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)
}