

iOS用のcustom keyboardを開発しているのですが、  
機種ごとの解像度への自動対応の仕組みで苦慮しています。

viewWillAppear内で

[code]

    let screenSize = UIScreen.mainScreen().bounds.size
    
[/code]

で画面サイズを取得して、  
その画面サイズから、キーボードの表示領域と、キーのwidthなどを計算で算出し、  
Interface Builderを使わずにキーボードを描画させていますが、  
新しいアプリでは大丈夫でも、  
少し昔のアプリでキーボードが表示されると、  
auto-scalingでサイズ拡大（おそらく約1.17倍）されてしまうことがあり、  
以下の画像のように、キーボードの右側が画面から溢れて、表示されないキーが生じてしまいます。

[![古いアプリでキーボードが拡大され、非表示領域ができてしまう。左が正しい表示。右が古いアプリで拡大表示への対応ができていない表示。](https://i.stack.imgur.com/5kDPn.png)](https://i.stack.imgur.com/5kDPn.png)

厄介なのは自動拡大された場合でも、上記screenSizeのwidthを取得すると、例えばiPhone6のサイズに合わせて375という値を返してきて、もともとの画面幅の320を返してくれないことです。  
（320を返してくれれば、簡単に計算し直せるのですが。）

そこで質問ですが、  
auto-scalingする前の実際の画像解像度を取得する方法はありますでしょうか。  
viewDidLoad内でやってもダメでした。  
もしくは、他に良い解決方法がありますでしょうか。  
例えば、constraintsをほぼ使っていないので、それを使えば解決できるでしょうか。  
（現状、ほぼ全てプログラム的に表示させており、constraintsを使っていません）

初歩的な質問かもしれず恐縮ですが、  
お分かりの方がおられれば、ご教授いただけると幸いです。

大まかな実装は、以下のような感じのコードです。

[code]

        //画面サイズ取得
        myAppFrameSize = UIScreen.mainScreen().bounds
    
        print(myAppFrameSize!.width)
    
        screenWidth = myAppFrameSize!.width
        screenHeight = myAppFrameSize!.height
    
        isPortlait = screenWidth > screenHeight ? false : true //画面方向の確認
        isIPad = screenWidth > 900 ? true:false
    
        if(isIPad){
            keyWidth = 100
        }else if(screenWidth < 900 && screenWidth > 370){
            keyWidth = 55
        }else{
            keyWidth = 48
        }
    
[/code]


CC BY-SA 3.0
2016-05-21T03:16:39.167
25055
2016-06-01T07:36:47.687
2016-05-21T03:35:44.070
15044
15044
question
swift ios
iOSのcustom keyboardで、画面解像度変更に対応したサイズ変換の実装ができません。


`viewDidLayoutSubviews` 内で `self.view.bounds` を参照してはいかがでしょうか。

何度か呼ばれる内、最初(`viewDidLoad` や `viewWillAppear`
が呼ばれる頃)は自動拡大される前のサイズ(width=375)になるかと思いますが、 `viewDidAppear`
が呼ばれる直前には自動拡大後のサイズ(width=320)が取れるようになるはずです。


CC BY-SA 3.0
2016-06-01T07:36:47.687
25357
2016-06-01T07:36:47.687
10871
25055
answer