UIBarButtonItemの "initWithImage"を使用してナビゲーションバーのカスタムイメージを初期化しようとすると、黒のナビゲーションバーに逆らって拡大されます。これは私がそれを作成する方法です:
UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"gear.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(showSetting:)];
これは次のようになります。
画像に問題がある場合はどうでしょうか?購入したアイコンのセットから入手しました。
バーボタンアイテムに表示される画像は、ソース画像から「派生」しています(レンダリングではアルファチャネル値のみを使用しますが、画像ではすべて問題ありません)。おそらく適切なサイズではないかもしれません-画像ファイルを開いて適切なサイズにトリミングする必要があるかもしれません。
imageInsetsプロパティ(IBarButtonItemによって継承されますIBarItemから継承)を使用してサイズを調整できるかどうかを確認することもできます伸びないようにしてください。
バーのアイテム画像のドコは次のように述べています:
バーに表示される画像はこの画像から派生しています。この画像が大きすぎてバーに収まらない場合は、拡大または縮小されます。通常、ツールバーとナビゲーションバーの画像のサイズは20 x 20ポイントです。 。
これを行う最良の方法は、ボタンを作成し、その背景画像を設定し、そのアクションを設定することです。次に、このボタンをカスタムビューとして使用して、UIBarButtonItemを作成できます。これが私のコード例です:
UIButton *settingsView = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 61, 30)];
[settingsView addTarget:self action:@selector(SettingsClicked) forControlEvents:UIControlEventTouchUpInside];
[settingsView setBackgroundImage:[UIImage imageNamed:@"settings"] forState:UIControlStateNormal];
UIBarButtonItem *settingsButton = [[UIBarButtonItem alloc] initWithCustomView:settingsView];
[self.navigationItem setRightBarButtonItem:settingsButton];
この質問には既にチェックマークが付いた回答があることは知っています。しかし、私は今日これに遭遇し、とにかく私の答えを提供すると思いました。上記のチェックマーク付きの回答は私に役立ちましたが、実際に何が起こっているのかを理解するために、いくつかの追加の実験も必要でした。
ボタン画像はx軸のみで縮小され、y軸では縮小されません。これは、ボタンに対して高すぎるため、ボタンが収まるように縮小するためです。しかし、比例して縮小するわけではありません。垂直のみ。だから伸びて見える。実際には伸びていません-これは拡大することを意味します。代わりに、高さが縮小されます。違いを知ることは、なぜそれが起こっているのか、そしてそれを修正する方法を理解するために重要だと思います。
OPと同じことを行いました。私は網膜をサポートしていると思って、アイコンを40x40にしました。鉱山はアルファチャンネル付きの緑色のチェックマークでした。 40x40になるように空白のピクセルが埋め込まれました。アプリは、ボタンの使用可能な高さに収まるようにサイズを変更しました。しかし、幅は同じままでした。したがって、40x30または40x20の範囲のどこかになりました。ボタンは30の高さのアイコンを処理できると思いますが、ボックスIMHOには少し大きすぎます。
OPはボタンを30x30に減らし、それによってそれはもうつぶれなくなりました。しかし、それは最善の解決策ではありません。あなたがそれをするとき、それは実際には網膜ボタンではないので。それは収縮し、網膜に吹き戻されます。
正解は、@ 2xで高さ40ピクセルのバージョンに名前を付け、次にハーフサイズ(高さ20ピクセル)バージョンを作成し、@ 2xなしで保存することです。幅は何でもかまいません。次に、@ 2xを指定せずにimageNamed:でロードします。網膜または非網膜デバイスに適切なpngを使用します。
次に起こったのは、ボタンフレームが小さすぎることでした。そこで、私はキャンバスのサイズをpsdで増やし、pngを80幅にパディングして、ボタンの幅を少し広げてタップしやすくしました。
leftBarButtonItemの背景画像を設定すると、40x40画像で同じstretchedの問題が発生しました
UIBarButtonItem *backButton = [UIBarButtonItem new];
[backButton setBackButtonBackgroundImage:[UIImage imageNamed:@"back_icon"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
self.navigationItem.leftBarButtonItem = backButton;
しかし、私の問題は解決済みを次のコードで取得しました
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_icon"] style:UIBarButtonItemStylePlain target:self action:@selector(handleBack:)];
self.navigationItem.leftBarButtonItem = backButton;
UIBarButtonItemStyleBorderedを使用した場合も同じ結果になります。
正しい画像サイズを設定します。最初に@ 1x = 22px、@ 2x = 44px @ 3x = 88px。
その後
let leftBarButtonItem = UIBarButtonItem(image: yourUIImage, style: .plain, target: self, action: #selector(action))
leftBarButtonItem.tintColor = UIColor.red
navigationItem.leftBarButtonItem = leftBarButtonItem
または
let btn = UIButton(type: .custom)
btn.addTarget(self, action: #selector(contactMe), for: .touchUpInside)
btn.setImage(#imageLiteral(resourceName: "open"), for: .normal)
具体的には、iOS 11でこのツールバーアイテムストレッチの問題に遭遇した場合は、フレームや境界をレンダリングするために画像の@ 2xバージョンが必要になっているようです。
したがって、次のようなカスタムイメージUIBarButtonItemを追加するこのようなコードがある場合:
UIButton *tagsBtn = [UIButton buttonWithType:UIButtonTypeCustom];
tagsBtn.bounds = CGRectMake( 0, 0, 40, 40);
[tagsBtn setImage:[UIImage imageNamed:@"tags.png"] forState:UIControlStateNormal];
tags = [[UIBarButtonItem alloc] initWithCustomView:tagsBtn];
[tagsBtn addTarget:self action:@selector(tags:) forControlEvents:UIControlEventTouchUpInside];
[bottomToolbar setItems:[NSArray arrayWithObjects:flexibleSpace,tags,flexibleSpace,nil]];
次に、tags.png画像が80x80であっても、80x80の[email protected]が必要になります。 tags.pngの名前を[email protected]に変更するだけで、コードを変更せずにiOS 11より前のように画像のサイズを40x40に変更したり、プロジェクトに[email protected]を追加したりできます。