2011年4月20日水曜日

Cocoa なんちゃってtabbed interface(4)NSStringでTruncate処理

なまじstringAttrbutesとかで描画用の属性をつけてしまっているので、Truncate処理が悲惨なことになった。

フツーにNSStringでdrawAtPointにしといたほうがよかったか・・。

とりあえずTruncate処理を付け加えることはできた。

ウィンドウをのサイズを変えるとこんなふうになる。


日本語でも処理そのものには全く支障がなかった。賢いぞCocoa。
考え方としては

1,描画したい領域のWidthよりも文字列のsize.widthが大きかったら
2,文字列をMutableStringにコピーして
3,forループで最終文字から1文字ずつ削りとり
4,描画したい領域より文字列のwidthが小さくなったら
5,forループから抜け出て
6,さらにうしろから2文字分削りとり
7、「..」を付け加る

という感じになる。ただしAttributedがはいるのでソースはこんなに汚くなる。(^^;)
NSAttributedString* sourceAttributedTitle=[[[NSAttributedString alloc] initWithString:title attributes:stringAttrbutes]autorelease];
    NSMutableAttributedString *titleForDraw=[[[NSMutableAttributedString alloc] initWithAttributedString:sourceAttributedTitle]autorelease];
    if([sourceAttributedTitle size].width> cellFrame.size.width){
        for (NSInteger i=[sourceAttributedTitle length]-1;i>0; i--) {
            [titleForDraw deleteCharactersInRange:NSMakeRange(i, 1)];
            if ([titleForDraw size].width< cellFrame.size.width){
                break;
            }
        }
        [titleForDraw deleteCharactersInRange:NSMakeRange([titleForDraw length]-2,2)];
        [titleForDraw appendAttributedString:[[NSAttributedString alloc] initWithString:@".." attributes:stringAttrbutes]]; 
    
    }
bloggerに文句を言われるため不等号は全角にしてある。
一応これで動くのでよしとするが、今後tabを増やす処理を付け加えていけば当然「1文字も描画できないせまさのtab」ができてしまうこともあるので、tabの最小幅を設定して、「見えなくなったtab」にどうにかしてアクセスする方法を考えていかなければ・・・。

その前に、現在はプレースホルダでしかない「新しいtabを増やす」、「tabを閉じる」ボタンを実装するほうが先か。

0 件のコメント:

コメントを投稿