10

プログラムtintColorで UINavigationBar を変更し、Interface Builder のようにグラデーションを維持したいと思います。

コードでを変更するtintColorとグラデーションが消えますがtintColor、Interface Builder で を変更するとグラデーションが保持されます。

何か案は?

4

5 に答える 5

20

これは古い質問ですが、この質問のように聞こえるが異なるものを探していたときに偶然見つけました。それが他の誰かを助けることを期待して(または他の誰かが私にもっと良い方法を教えてくれることを願って)...

UINavigationBar にカスタム グラデーションを実装するにはどうすればよいですか?

まず、通常の方法で (CALayer として) カスタム グラデーションを取得しましょう。

- (CALayer *)gradientBGLayerForBounds:(CGRect)bounds
{
    CAGradientLayer * gradientBG = [CAGradientLayer layer];
    gradientBG.frame = bounds;
    gradientBG.colors = @[ (id)[[UIColor redColor] CGColor], (id)[[UIColor purpleColor] CGColor] ];
    return gradientBG;
}

このコードは架空のアプリI Have A Punk-Rocker With Questionable Tastes In My Pocket用であるため、これは良いことです。その名前私は少し長すぎます..

UINavigationBar にこのレイヤーを追加したいのですが、簡単でしょうか? サブレイヤーとして追加するだけですよね?ここでの問題は、UINavigationController が提供するすばらしいボタンや機能を覆い隠してしまうことです。良くないね。

代わりに、アプリ内のすべての UINavigationBar(s) の外観を変更するために、iOS5+ にある便利なメソッドを見てみましょう。

[[UINavigationBar appearance] setBackgroundImage:SOME_IMAGE
                                   forBarMetrics:UIBarMetricsDefault];

ここでの唯一の問題は、UIImage がなく、CALayer があることです。パンクロック愛好家は何をしますか?

CALayer * bgGradientLayer = [self gradientBGLayerForBounds:ONE_OF_YOUR_NAV_CONTROLLERS.navigationBar.bounds];
UIGraphicsBeginImageContext(bgGradientLayer.bounds.size);
[bgGradientLayer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * bgAsImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CALayer を UIImage に変換したので (うまくいけば)、あとは設定するだけです。

if (bgAsImage != nil)
{
    [[UINavigationBar appearance] setBackgroundImage:bgAsImage
                                       forBarMetrics:UIBarMetricsDefault];
}
else
{
    NSLog(@"Failded to create gradient bg image, user will see standard tint color gradient.");
}

このソリューションで私が気に入っているのは

  • アプリ内のすべての UINavigationBar の集中型コード (AppDelegate 内)
  • tintColor は、すべての UINavigation ボタン (戻る、編集など) で引き続き使用されます。
  • UIImage の作成が失敗した場合、私の UINavigationBar(s) は引き続き tintColor を尊重します
  • 実際の画像リソースに依存する必要がない / 更新が簡単

しかし、それが最善の方法であるとはまだ確信していません。それで、それがあなたに役立つなら楽しんでください、できればそれを改善する方法を教えてください.

〜ありがとう

于 2013-02-26T21:45:44.640 に答える
14

barStyle を UIBarStyleBlackTranslucent に設定します。次のように tintColor を設定します。

navigationBar.tintColor = [UIColor colorWithRed:.7 green:.5 blue:.2 alpha:1];

これにより、適切なグラデーションが設定されます。必要な組み合わせを使用してください。

于 2009-02-08T00:32:36.030 に答える
1

Swift 2.0 の UIImage 拡張機能として書きました。多分それは何かの役に立ちます。

extension UIImage {

    class func convertGradientToImage(colors: [UIColor], frame: CGRect) -> UIImage {

        // start with a CAGradientLayer
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = frame

        // add colors as CGCologRef to a new array and calculate the distances
        var colorsRef : [CGColorRef] = []
        var locations : [NSNumber] = []

        for i in 0 ... colors.count-1 {
            colorsRef.append(colors[i].CGColor as CGColorRef)
            locations.append(Float(i)/Float(colors.count))
        }

        gradientLayer.colors = colorsRef
        gradientLayer.locations = locations

        // now build a UIImage from the gradient
        UIGraphicsBeginImageContext(gradientLayer.bounds.size)
        gradientLayer.renderInContext(UIGraphicsGetCurrentContext()!)
        let gradientImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        // return the gradient image
        return gradientImage
    }
}

次のように呼び出します。

let colors = [
    UIColor.blueColor(),
    UIColor.greenColor()
    // and many more if you wish
]
let gradientImage = UIImage.convertGradientToImage(colors, frame: navigationBar.bounds)
navigationBar.setBackgroundImage(gradientImage, forBarMetrics: .Default)
于 2015-09-21T13:08:15.240 に答える
0
navigation.tintColor = [UIColor colorWithRed:0.47f green:0.23f blue:0.61f alpha:1.0f];
于 2012-04-03T12:46:22.700 に答える
0

maskView を使用する良い方法

// create gradient view
let gradientView: UIView = UIView(frame: frame)
let gradient: CAGradientLayer = CAGradientLayer()
gradient.frame = gradientView.bounds
gradient.colors = [UIColor.grayColor().CGColor, UIColor.clearColor().CGColor]
gradientView.layer.insertSublayer(gradient, atIndex: 0)

//set appearance 
UINavigationBar.appearance().maskView = gradientView
于 2016-03-21T07:14:45.790 に答える