2017-09-15 15 views
13

私の質問に対する答えはthis questionにありますので、答えは私のUIToolbarビューの自動レイアウトを無効にすることです。iOS 11 UIBarButtonItemイメージはサイズ変更されていません

ビューのために働くと言われているコードは

cButton.translatesAutoresizingMaskIntoConstraints = YES; 

あるしかし、私はUIToolbarはUIViewのから継承していないので、それは私のコードに適用されるかはわかりません。

私はゲームで使用する小さなイメージが多く、デバイスや向きによってサイズが異なります。 Appleが新しいデバイスを導入したときに、さまざまなイメージをたくさん用意して新しいイメージを追加するのではなく、160x160のイメージを1つずつ作成し、使用時にサイズを変更することにしました。

// 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次のようになります。コードは非常に簡単ですiOSの10が、iOSの11

に失敗した - これは、iOS 4からうまく働きました。バーボタンのアイテムは、サイズ変更され、ボトムバーにうまく収まりました。ノート私は正しいコードを見ていることを確認するためにチェックマークのサイズを50%縮小し、予想通りに動作することを確認しました。

correct version

は、ここで彼らはXcodeの9.0 GMとiOSのボタンの一番上の行が正しくサイズを変更するが、一番下の行は、タブバーのために割り当てられたスペースを埋めるために拡大していること11.注シミュレータでどのように見えるかです。 iPadsやさまざまなデバイスでも同じ動作が起こります。

iOS 11

自動レイアウトを無効にするか、制約を追加する方法についての任意のアイデア?

答えて

42

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

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

のObjective C

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

ヒントをお寄せいただきありがとうございます。私はObj Cバージョンを追加しました。 – JScarry

+0

素晴らしい!それは私のために働いた。感謝します。 – Bucket

0

Fallstreakの答え(1)は、私の場合はソリューションでした。私はタップで動作しないカスタムビューを持っていた。ちょうど私が作業するナビゲーション項目のカスタムビューのためにしなければならなかったものを共有したいと思った。これはすべて迅速です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行は、Fallstreakの回答から得られたもので、この場合の解決策です。