3226


iOS8でUIPickerViewを使用しているのですが、項目のtitleが長すぎて、最後が「...」と省略されてしまうので、フォントサイズを調整して対応しようとしました。

pickerView:titleForRow:forComponent: メソッドでは、フォントサイズの調整項目がないので、

pickerView:viewForRow:forComponent:reusingView:
メソッドで、UILabelにattributedStringを指定したものを戻り値にして、フォントサイズの調整を行いました。

その目的は上手く果たせたのですが、pickerView:titleForRow:forComponent:
メソッドでは、pikerViewの中央選択部位が、非選択部位に対して拡大表示されているのに対し、pickerView:viewForRow:forComponent:reusingView:
メソッドでは、その拡大表示効果がなくなっていることに気がつきました（添付図をご参照ください）。

選択項目全体が表示されることが第一優先ではあるのですが、選択部位が拡大表示される効果は、選択時に分かりやすい効果があると思っています。もし、可能であれば、この２つを両立させたいと思っているのですが、UIPickerViewを用いて、これを実現するのは可能でしょうか？
もし、可能であるなら、その手法、あるいは例を示唆いただけないでしょうか？ 現在、Swiftを使っていますが、Objective-
Cでも構いません。よろしくお願いいたします。

ちなみに  
pickerView:attributedTitleForRow:forComponent:
メソッドは、referenceにもdeprecatedとの記載はないのですが、iOS7以降では、上手く稼働しないとの報告もあり、実際試してみましたが、pickerView:titleForRow:forComponent:
メソッドとの違いが確認できませんでした（フォントサイズの調整ができませんでした）。

![添付図１](https://i.stack.imgur.com/3E6rL.png)![添付図２](https://i.stack.imgur.com/SeZ18.png)


CC BY-SA 3.0
2015-01-05T04:42:48.833
3098
2015-01-07T02:48:37.890
6006
question
ios objective-c swift xcode6
UIPickerViewでの中央選択部の拡大表示について（iOS8）


自己回答です。やっぱり難しいでしょうか？

その後、自分で調べて分かったところを記載しておきます（Appleのreferenceには記載されていないことを中心に）。

UIPickerViewの項目を設定するdelegate methodには、以下の３つがあります。

[code]

    pickerView:titleForRow:forComponent:
    pickerView:attributedTitleForRow:forComponent:
    pickerView:viewForRow:forComponent:reusingView:
    
[/code]

pickerView:titleForRow:forComponent:

→テキストを設定するだけの最も簡単なもの。中央選択部位が拡大表示される。

pickerView:attributedTitleForRow:forComponent:

→attributeを設定できるのは、テキストの色だけ。中央選択部位が拡大表示される。

pickerView:viewForRow:forComponent:reusingView:

→いろいろカスタマイズする場合には、これ。UIViewとしてUILabelを使って、UILabelにNSAttributedStringを設定する手法が多く紹介されている。中央選択部位の拡大表示がなくなってしまう。

このメソッドについては、英語版stackoverflowでも、下記のコメントを見つけました。

The only issue with this approach is that views in picker view don't get the
nice zoom effect when selected but strings do. – Indoor Dec 27 '13 at 18:56

<https://stackoverflow.com/questions/18945119>

しかし、自分のサーチ能力では、このIndoorさん以外にUIPickerViewの拡大表示に言及している人は誰もいませんでした。


CC BY-SA 3.0
2015-01-06T13:10:15.003
3198
2015-01-06T13:10:15.003
2017-05-23T12:38:55.250
-1
6006
3098
answer


現状のapiだけでは難しそうです。例えできたとしても、かなり無理のある作りにならざるを得ません。

下記のようにdelegateの中でフォントを変更することはできますが(選択部分は拡大と言うよりは単にフォントが大きくなっているように見える)、選択後の動作なので元々の動きとは異なります。また、`selectRow:inComponent:animated:`で選択した場合にはこのメソッドが呼ばれないため、初回表示時などにも別途対策が必要です。

[code]

    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
        _selectedLabel.font = [UIFont systemFontOfSize:15];
        UILabel *label = (UILabel*)[pickerView viewForRow:row forComponent:component];
        label.font = [UIFont systemFontOfSize:20];
        _selectedLabel = label; // フォントサイズを戻すために保持
    }
    
[/code]


CC BY-SA 3.0
2015-01-07T02:48:37.890
3226
2015-01-07T02:48:37.890
3154
3098
answer