cocos2d-xなので、CCLabelBMFontを使ってるのですが、widthに合わせて文字がちっちゃくなったりしないので、
文字数オーバーすると画面からはみ出たりでめんどくさいです。
というわけで、widthを制限して超えると縮むラベルを作りました。
見づらいけど、全文記載します。
ScaleLabelBMFont.h
#ifndef __ScaleLabelBMFont__NODE_H__
#define __ScaleLabelBMFont__NODE_H__
#include "cocos2d.h"
USING_NS_CC;
class ScaleLabelBMFont : public CCLabelBMFont
{
public:
    static ScaleLabelBMFont* create(const char *str, const char *fntFile, float limitWidth, float currentScale);
 virtual bool init(const char *str, const char *fntFile, float limitWidth, float currentScale);
    virtual void updateLabel();
    
    CC_SYNTHESIZE(float, _limitWidth, LimitWidth);
    CC_SYNTHESIZE(float, _currentScale, CurrentScale);
};
#endif // __ScaleLabelBMFont__NODE_H__
ScaleLabelBMFont.cpp
#include "ScaleLabelBMFont.h"
ScaleLabelBMFont* ScaleLabelBMFont::create(const char *str, const char *fntFile, float limitWidth, float currentScale)
{
    ScaleLabelBMFont * pRet = new ScaleLabelBMFont();
    if (pRet && pRet->init(str, fntFile, limitWidth, currentScale)) {
        pRet->autorelease();
    } else {
        CC_SAFE_DELETE(pRet);
    }
    return pRet;
}
bool ScaleLabelBMFont::init(const char *str, const char *fntFile, float limitWidth, float currentScale)
{
 if ( !CCLabelBMFont::initWithString(str, fntFile) )
 {
  return false;
 }
    
    _limitWidth = limitWidth;
    _currentScale = currentScale;
    setScale(_currentScale);
 return true;
}
void ScaleLabelBMFont::updateLabel()
{
    CCLabelBMFont::updateLabel();
    if ((getContentSize().width * _currentScale) > _limitWidth) {
        float scaleX = _limitWidth / getContentSize().width;
        if (getScaleX() != scaleX) {
            setScaleX(scaleX);
        }
    }
}