iOS UIBarButtonItemのタイトルテキストの削除


198

私がやりたかったことはUIBarButtonItem、ナビゲーションバーに青いシェブロンだけを残して、の[戻る]ボタンからテキストを削除することです。私はiOS 7向けに開発していることを覚えておいてください。以下を含むいくつかの方法を試しましたが、これらに限定されません。

これは私が気に入らなかった画像方法です(画像が場違いに見えました):

UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;

私が試した別の方法はこれで、これは単に機能しませんでした(何も表示されませんでした)。

UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;

私が達成したかったのは、1つのシェブロンだけを備えたiOS 7 Musicアプリにある戻るボタンのようなものです。

ありがとう。



要件のイメージをつかんでみませんか?そして、それをleftBarButtonItemで参照します。
Vishal Sharma

画像メソッドを使用しなかった理由は、1。[戻る]ボタンの完全な画像を取得するのが非常に難しいこと、2。画像との位置がずれて自然に見えないことです。それが理由です。 StackOverflowを使用して、これをネイティブで実現する方法のヘルプを求めました。
Pan Ziyue、2015

回答:


198
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60)
                                                         forBarMetrics:UIBarMetricsDefault];

次に、戻るボタンアイテムのタイトルを削除できます。

ストーリーボードを使用する場合は、ナビゲーション属性インスペクターの[戻る]ボタンにスペースを設定できます。


95
大きなタイトルには問題があります。それらは中央に配置されず、右に押されます。
たとえば

11
ユーザーが[ユーザー補助-ボタンの形状]をオンにしている場合、これは機能しません
Mikael Bartlett

22
私はこれがより良い答えだと思います:[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
ベンジャミン2015

19
マジックナンバーが含まれるソリューションはお勧めできません。自動レイアウト、サイズクラス、アクセシビリティ機能などへのプッシュにより、このような定数値を使用することはあなたを悩ませます。
Michael Peterson

3
ベンジャミンのコメントを改善するには、これUIControlStateHighlightedも同様に設定する必要があります
n_b

411

タイトルを変更せずにビューコントローラの戻るボタンのタイトルを設定するには、次のように使用します。

Objective-C:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];

迅速:

navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

明確にするために、これは、戻るボタンを押した場合に表示されるビューコントローラで行われます。つまり、「<設定」を表示する代わりに、単に「<」を表示したい場合は、SettingsViewControllerでこれをに配置しますinit。そうすれば、ビューコントローラ自体を見ているときにタイトルが表示されないという問題が発生することはありません。


1
他の答えが正しいとマークされている理由がわかりません。タイトルを削除するだけなので、戻るボタンには表示する「タイトル」がありますが、これは正しいアプローチではありません。これが正解です。
パッハ、2014年

8
また、Swiftを使用している人にとっては、navigationItem.backBarButtonItem = UIBarButtonItem(title: ""、style:.Plain、target:nil、action:nil)です。Obj-CからSwiftに変換するのは難しくありませんが、問題を解決します
Zoyt

15
@BenjaminPietteは、戻るボタンを押すと表示されるUIViewControllerでこれを呼び出していますか?戻るボタンを表示するUIViewControllerではありません。
DonnaLea 2014年

2
なんてエレガントなソリューションでしょう!ありがとう。相殺することは正しくないと感じました。
hyd00

2
このソリューションは、ナビゲーションスタックの以前のコントローラーでこのコード行を記述した場合に完全に機能します。
Bohdan Savych 2017

128

ストーリーボードを使用している場合Attributes Inspectorは、ViewControllerのNavigation Item(をクリックしてNavigation Bar)に移動し、Back Buttonプロパティを ""(1つのスペース文字)に設定します。これにより、戻るボタンのタイトルが1つのスペース文字に設定され、山形が表示されたままになります。コードをいじる必要はありません。

example image

これにより、上にプッシュされたビューコントローラーからこのビューコントローラーにシークする[戻る]ボタンのBack Buttonタイトルが設定されます。このコントローラー内に表示されるものではありません。Back Button


10
私はこれをさらに賛成したいと思います:「これは、この内部に表示される[戻る]ボタンではなく、その上にプッシュされたものからこのビューコントローラーにシークする[戻る]ボタンに[戻る]ボタンのタイトルを設定することに注意してください。コントローラ!"
ジェイソンレーン

121

これは私に「バック」シェブロンをテキストなしで表示するのに役立ちます:

self.navigationController.navigationBar.topItem.title = @"";

viewDidLoadナビゲーションバーを表示するビューコントローラーでこのプロパティを設定すると、トリックが実行されます。

注:私はiOS 7でのみテストしましたが、これは問題の範囲内です。


33
これには、ナビゲーションバーの中央にあるタイトルラベルが削除されるという副作用があります。
Pwner

7
同じプロパティを使用して、「viewWillAppear」にプッシュVCのタイトルを設定します。この方法では削除されません。
Guto Araujo

5
そのコードの一部を-viewDidLoadVC に移動しましたが、Backテキストは必要ありません。しかし、後で見つけたのはnavigationController、タイトルから2番目のVCをポップすると、すぐにではなく、すぐにタイトルテキストが表示されるということです。ビデオがこれをよりよく説明していると思いますので、ここにそれを示します:リンク
Pan Ziyue

1
これは最良の答えではありません。andyleehaoの答えを参照してください。
lmnbeyond

1
これは、Appleのドキュメントによると正しい答えです。「レシーバーがナビゲーションアイテムスタック上にあり、上から2番目にある場合、つまり、ビューコントローラーは、ユーザーがナビゲートするビューにこのプロパティの値を管理します。最上部のナビゲーションバーの戻るボタンに使用されます。このプロパティの値がnilの場合、システムは文字列「戻る」を戻るボタンのテキストとして使用します。
Raphael Oliveira

27

ボタンのタイトルを設定するときは、@の代わりに@を使用してください。

-編集-

他の文字列を試しても何か変化はありますか?私は自分で次のコードをうまく使用しています:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];

backStringは、私がiOS 7以下のバージョンを使用しているかどうかに応じて、@ ""または@ "Back"に設定される変数です。

注意すべき点の1つは、このコードが、戻るボタンをカスタマイズするページのコントローラーにないことです。ナビゲーションスタックでは、実際にはコントローラーの前にあります。


うーん、iOS 7はそれを変えていないようです。タイトルとして「Back」を使い続ける。setLeftBarButtonItem:backButton代わりに置くと何もありません。
パンZiyue 2013

1
その場合、タイトルを別のタイトルに設定しても何も起こらない場合は、コードを親のビューコントローラーに移動する必要があると思います。上記で投稿したコードをprepareForSegueメソッドで使用しています。
カマロス2013

27

ここに画像の説明を入力してください

状況を把握することが役立つ場合があります。これは、「戻る」テキストを非表示にし、矢印を表示する最小限のプロジェクトです。

ストーリーボード

ここに画像の説明を入力してください

「Show Second View Controller」ボタンからセカンドビューコントローラーへのセグエショーがあります。

また、2番目のビューコントローラーにナビゲーションアイテムを追加して、タイトルを付けました。これはオプションです。戻るボタンには影響しません。

コード

FirstViewController.swift

import UIKit
class FirstViewController: UIViewController {

    @IBAction func showSecondViewControllerButtonTapped(sender: UIButton) {

        // hide the back button text
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {
    // Nothing at all needed here
}

代替方法(IBのみ、コードなし)

ストーリーボードで、(2番目ではなく)最初のビューコントローラーのナビゲーション項目を選択します。戻るボタンのテキスト用のスペースを入力するだけです。

ここに画像の説明を入力してください


「最初のビューコントローラー(2番目ではない)の場合」とは、戻ってきたいVCの名前であるという重要な概念なので、このタイトルを付けるのはその責任です。
buguibu 2017年

15
self.navigationController.navigationBar.topItem.title = @"";

1
topItemの代わりにbackItemを使用できます。TopItemはタイトルを非表示にし、backItemは戻るボタンのタイトルを非表示にします。
Ravi Ojha

2
これは、childViewControllerがNavigationControllerの子スタックの深さ2+にある場合の唯一の解決策です
Nathaniel Blumer

2
これにより、前のビューコントローラのタイトルも削除されます。ほとんどの場合、これは
最悪です

11

iOS7では、AppleはUINavigationBarに2つの新しいプロパティ「backIndicatorTransitionMaskImage」と「backIndicatorImage」を導入しました。

一度呼び出すだけで:

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];

デフォルトのシェブロングリフの代わりにカスタムイメージをレンダリングし、keyWindowのティントカラーを継承します。

タイトルを削除するために、カマロスの答えを提案します。新しいビューコントローラーをプッシュしているビューコントローラーでこのコードを呼び出すことを忘れないでください。iOS UIBarButtonItemのタイトルテキストを削除する


ティントカラーを調整するには[[UINavigationBar Appearance] setTintColor:[UIColor whiteColor]];
Mazen Kasser 2013年

10

提供された回答で私は多くの成功を収めることはできませんでしたが、非常に簡単な回避策を見つけました。ストーリーボードで、UIViewControllerのナビゲーション項目をクリックして、戻るボタンのテキストを設定できます。私はそれを単一の ''スペースに設定し、私が探していた振る舞いを与えました。ここに画像の説明を入力してください


10

これは私にとってiOS10でうまくいきました。ビューコントローラーのviewDidLoadから呼び出します。

self.navigationController?.navigationBar.topItem?.title = ""

6

iOS7および6で動作するこの問題の簡単な解決策は、viewDidLoadでカスタムタイトルビューを設定することです。

- (void)viewDidLoad {

    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    titleLabel.text = self.title;
    titleLabel.backgroundColor = [UIColor clearColor];

    [titleLabel sizeToFit];

    self.navigationItem.titleView = titleLabel;
}

次に、viewWillAppear:安全に呼び出すことができます

self.navigationController.navigationBar.topItem.title = @" ";

タイトルビューはカスタムビューであるため、ナビゲーションスタックに戻っても上書きされません。


コードの後半部分だけが必要で、空白のUILabelは必要ありませんでした。[self.navigationItem.backBarButtonItem setTitle:@" "];viewWillAppear で呼び出していましたが、モーダルビューを閉じた後に表示されたビューでは機能しませんでした。
Diziet 2014年

6

実際、これは1つのトリックで実行できます。

UINavigationBarクラスをオーバーライドして、次のコード行を追加します。

- (void)layoutSubviews{
    self.backItem.title = @"";
    [super layoutSubviews];
}

次にUINavigationController、このカスタムUINavigationBarクラスで初期化します。UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

お役に立てれば


これでうまくいきました。iOS 7のプッシュアニメーションは少しぎこちないように見えますが、タイトルがないため、タイトルが[戻る]ボタンを配置する余地を作るように見えます。
ゼケル2014

ええ、navigationItem.titleを直接設定する代わりに、カスタムのtitleViewを使用してみてください。これで問題は解決すると思います。
rordulu 2014

このソリューションは、サブクラスを持つすべてのnavigationBarに対してグローバルであるため、すばらしいものです。ありがとう
イエティスパパ2017年

5

ドナリーの答えを使って一緒に何かを石畳にすることができました。これは、ソリューションが私のUIViewControllerサブクラスに表示される方法です。

var backItemTitle:String?

override func viewDidLoad() {
    super.viewDidLoad()

    //store the original title
    backItemTitle = self.navigationController?.navigationBar.topItem?.title

    //remove the title for the back button
    navigationController?.navigationBar.topItem?.title = ""
}

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {

        //restore the orignal title
        navigationController?.navigationBar.backItem?.title = backItemTitle
    }
}

元の回答の問題は、タイトルに戻ったときにコントローラーからタイトルが削除されることです。viewWillDisappearでタイトルをリセットしようとしても、移行プロセスでは遅すぎます。これにより、タイトルがうまくアニメーションするのではなく、元に戻ります。ただし、willMoveToParentViewControllerの方が早く実行され、正しい動作が可能になります。

警告:これは通常のUINavigationControllerプッシュ/ポップでのみテストしました。他の状況では、予期しない動作がさらに発生する可能性があります。


4

最初のViewControllerのprepareForSegue:メソッドで、そのビューのタイトルを@ ""に設定したため、次のビューがプッシュされると、前のViewControllerのタイトル(@ "")が表示されます。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

これの唯一の問題は、戻るボタンを押したときに以前のビューにタイトルがないため、viewWillAppearで再度追加できることです。

- (void)viewWillAppear:(BOOL)animated{
    self.navigationItem.title = @"First View Title";
}

私はこのソリューションがあまり好きではありませんが、うまくいき、他の方法を見つけることができませんでした。



3

答えのどれも私を助けませんでした。しかし、トリックはありました-押す直前に(戻るボタンが移動する場所にある)ビューコントローラのタイトルをクリアしました。

したがって、前のビューにタイトルがない場合、iOS 7では、戻るボタンには矢印が表示され、テキストは表示されません。

viewWillAppear押しビューの、私は元のタイトルを戻しました。


1
うーん、このトリックはうまくいきます。しかし、そこにある言葉が時々ちらつくようです。あまり良い回避策ではありませんが、それでも良い回避策です。+1
Pan Ziyue 2013年

3
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

    [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

私は同じ問題を抱えていたので、私はこのようにしました。

-編集-

これは、すべてのUIBarbuttonItemのタイトルテキストを本当に削除したい場合の解決策です。バックバーボタンアイテムのタイトルのみを削除する場合、簡単で便利な解決策はありません。私の場合、タイトルテキストを表示する必要のあるUIBarButtonItemsが少ないので、これらの特定のボタンのtitleTextAttributesを変更しました。より具体的にしたい場合は、以下のコードを使用してください。これにより、ナビゲーションバーのボタンのみが変更されます。

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

1
これは私にとってはうまくいきますが、反撃するときにテキストを簡単に見ることができます。
Diziet 2014年

3
@Diziet UIControlStateHighlightedも同様に州に追加してみてください
CoderPug 2014年

2
これは正常に動作しますが、これにより、[戻る]ボタンだけでなく他のすべてのボタンも「非表示」になります...これを解決するためのアイデアはありますか?
Urkman 2014年

3

これはサブクラスを使用しています navigationControllerすることで「戻る」を削除します。

これを使用して、アプリから永続的に削除します。

//.h
@interface OPCustomNavigationController : UINavigationController 

@end

//.m
@implementation OPCustomNavigationController

- (void)awakeFromNib
{
    [self backButtonUIOverride:YES];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [self backButtonUIOverride:NO];

    [super pushViewController:viewController animated:animated];
}

- (void)backButtonUIOverride:(BOOL)isRoot
{
    if (!self.viewControllers.count)
        return;

    UIViewController *viewController;

    if (isRoot)
    {
        viewController = self.viewControllers.firstObject;
    }
    else
    {
        int previousIndex = self.viewControllers.count - 1;

        viewController = [self.viewControllers objectAtIndex:previousIndex];
    }

    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                                       style:UIBarButtonItemStylePlain
                                                                                      target:nil
                                                                                      action:nil];
}

@end

3
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
                                                               NSFontAttributeName:[UIFont systemFontOfSize:1]}
                                                    forState:UIControlStateNormal];

1
回答に説明を追加してください。
Alex

1ナビゲーションバーと同じ色にする2テキストのサイズを小さくして、タイトルを圧迫しないようにする
Bill Xie

私はあなたの答えをレビューしました、あなたは常にあなたの答えを支持するべきです。
アレックス

2

ナビゲーションバーの戻るボタンのタイトルを非表示

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

2

これが私がやっていることで、戻るボタンのタイトルを削除する方が簡単です

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar?.backItem?.title = ""
}

2

Swift 3.1 これを行うには、UINavigationControllerのデリゲートメソッドを実装します。タイトルは[戻る]ボタンのみで非表示になりますが、戻る矢印の画像とデフォルトの機能は引き続き利用できます。

func navigationController(_ navigationController: UINavigationController, 
  willShow viewController: UIViewController, animated: Bool) {
        let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                    action: nil)
        viewController.navigationItem.backBarButtonItem = item
    }

1

これを使用することもできます:

UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;

[temporaryBarButtonItem release];

これは私のために働く


1
case : <Back as <

override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
    }

1

グローバルに最適なソリューション

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)

    return true
}

すべてのダンプソリューション...以前と同じようにその使用スペースも...透明になるだけ
Laszlo

それはアプリのすべてのUIBarButtonItemsからテキストを削除します
Mikel Sanchez

1

カスタムクラスを作成UINavigationControllerして、アプリのすべてのナビゲーションコントローラーに適用します。このカスタムUINavigationControllerクラス内では、ビューが読み込まれるとUINavigationBarデリゲートを設定しselfます。

- (void)viewDidLoad {
    self.navigationBar.delegate = self;
}

次に、デリゲートメソッドを実装します。

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {

    // This will clear the title of the previous view controller
    // so the back button is always just a back chevron without a title
    if (self.viewControllers.count > 1) {
        UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)];
        previousViewController.title = @"";
    }
    return YES;
}

このようにして、カスタムクラスをすべてのナビゲーションコントローラーに割り当てるだけで、すべての戻るボタンからタイトルがクリアされます。そして、わかりやすくするviewWillAppearために、内部の他のすべてのView Controllerのタイトルを常に設定して、ビューが表示される直前にタイトルが常に更新されるようにします(このようなトリックで削除された場合を考慮して)。


1

戻るボタンのナビゲーション項目を1つのスペースに入力するだけで機能します。


1
これは回答よりもコメントとして適しています。
Al Lelopath 2017

1

私のように、の代わりにカスタムビューを使用しUINavigationBarていて、[戻る]ボタンが表示されない場合は、少しぎこちない感じの作業を行う必要があります。

[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];

表示されない場合は、タイトルを表示しようとしても、表示される前に表示されて非表示になり、問題が解決します。


1
extension UIViewController{
    func hideBackButton(){
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

1

私は非常に単純なゼロ構成カテゴリを作成して、アプリ全体ですべての戻るボタンのタイトルを非表示にしましたここで確認できます。この質問はすでに回答を受け入れていますが、他の人にとっては役立つかもしれません。

編集:

.hファイル

#import <UIKit/UIKit.h>

@interface UINavigationController (HideBackTitle)
extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector);

@end

.mファイル

#import "UINavigationController+HideBackTitle.h"
#import <objc/runtime.h>


@implementation UINavigationController (HideBackTitle)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        PJSwizzleMethod([self class],
                    @selector(pushViewController:animated:),
                    @selector(pj_pushViewController:animated:));
    });
}

- (void)pj_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    UIViewController *disappearingViewController =  self.viewControllers.lastObject;
    if (disappearingViewController) {
        disappearingViewController.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    }
    if (!disappearingViewController) {
        return [self pj_pushViewController:viewController animated:animated];
    }
    return [self pj_pushViewController:viewController animated:animated];
}



@end

void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector)
{
    Method originalMethod = class_getInstanceMethod(cls, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);

    BOOL didAddMethod =
    class_addMethod(cls,
                originalSelector,
                method_getImplementation(swizzledMethod),
                method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(cls,
                        swizzledSelector,
                        method_getImplementation(originalMethod),
                        method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.