web-dev-qa-db-ja.com

iOS 11 UIBarButtonItem画像のサイズ変更

私の質問への答えは この質問 で示唆されていたので、答えは私のUIToolbarビューの自動レイアウトを無効にすることだと思います。

ビューで機能すると言われているコードは

cButton.translatesAutoresizingMaskIntoConstraints = YES;

しかし、UIToolbarはUIViewを継承しないため、コードに適用されるかどうかはわかりません。

ゲームで使用するデバイスや向きに応じて異なるサイズの小さな画像がたくさんあります。たくさんの異なる画像を用意し、Appleが新しいデバイスを導入するときに新しい画像を追加するのではなく、160x160の画像をそれぞれ前面に置き、使用時にサイズを変更することにしました。 4-iOS 10ですが、iOS 11では失敗します。

コードは非常に簡単です:

// Get the image
NSString *pictFile = [[NSBundle mainBundle] pathForResource:@"Correct" ofType:@"png"];
UIImage *imageToDisplay = [UIImage imageWithContentsOfFile:pictFile];
UIImage *cImage  = [UIImage imageWithCGImage:imageToDisplay.CGImage scale:[UIScreen mainScreen].scale orientation:imageToDisplay.imageOrientation];

UIButton *cButton = [UIButton buttonWithType:UIButtonTypeCustom];
[cButton setImage:cImage forState:UIControlStateNormal];
[cButton setTitle:@"c" forState:UIControlStateNormal];

//set the frame of the button to the size of the image
cButton.frame = CGRectMake(0, 0, standardButtonSize.width, standardButtonSize.height);

//create a UIBarButtonItem with the button as a custom view
c = [[UIBarButtonItem alloc] initWithCustomView:cButton];

これはpre11のように見えます。バーのボタン項目のサイズが変更され、下部のバーにうまく収まりました。注:正しいコードを見て、期待どおりに動作することを確認するために、チェックマークのサイズを50%縮小しました。

correct version

Xcode 9.0 GMおよびiOS 11のシミュレーターでの表示は次のとおりです。ボタンの一番上の行は正しくサイズ変更されますが、一番下の行はタブバーに割り当てられたスペースを埋めるように拡大します。 iPadやさまざまなデバイスでも同じ動作が発生します。

iOS 11

自動レイアウトを無効にする方法や制約を追加する方法についてのアイデアはありますか?

14
JScarry

BarButtonItem(iOS11\xCode9)は、フレームの代わりに自動レイアウトを使用します。これを試してください(Swift):

if #available(iOS 9.0, *) {
    cButton.widthAnchor.constraint(equalToConstant: customViewButton.width).isActive = true
    cButton.heightAnchor.constraint(equalToConstant: customViewButton.height).isActive = true
}

目的C

if (@available(iOS 9, *)) {
     [cButton.widthAnchor constraintEqualToConstant: standardButtonSize.width].active = YES;
     [cButton.heightAnchor constraintEqualToConstant: standardButtonSize.height].active = YES;
}
47
Fallstreak

私の場合、フォールストリークの回答(+1)が解決策でした。タップで動作しないカスタムビューがありました。ナビゲーションアイテムのカスタムビューが機能するために必要なことを共有したかっただけです。これはすべてSwift 3

let backButtonView = BackButtonView.loadNib()
backButtonView?.addTarget(self, action: #selector(returnToPrevious), for: .touchUpInside)
backButtonView.widthAnchor.constraint(equalToConstant: backButtonView.frame.width).isActive = true
backButtonView.heightAnchor.constraint(equalToConstant: backButtonView.frame.height).isActive = true
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButtonView!)

アンカーの幅/高さについての2行は、フォールストリークの答えから来ており、この場合の解決策でした。

0
Micah Montoya