http://blog.csdn.net/star530/article/details/22757281
好了,這次又把Label這貨拉出來鞭一鞭。
我先創建一個label
如下圖所示,labelTTF是不會自動換行的,那要實現換行該怎麼做呢?
說到Label如何換行,首先想到的就是設置label的尺寸,讓它到了邊界時要懂得自己換行,添加一行代碼:
注意這裡使用的不是setContentSize();運行結果如下圖
上面這種方法固然方便,但還是有它的侷限性:假如我們做的是一個類似微信的聊天對話框,這種對話框一個特點就是會隨著你文字長度的改變而改變。而如果我們在這裡講Label的尺寸給寫死了,那對話框也就跟著失去它的靈活性了。
這裡有沒有更酷的解決辦法麼?答案是肯定的。
LabelTTF有一個好處就是會在字符串中有"\n"的地方換行,利用這個特點可以寫一個自動換行的函數,參考代碼如下:
//str是傳入的字符串,length是每行的長度
現在用這種方法重寫一次label的創建過程
http://shahdza.blog.51cto.com/2410787/1560612
好了,這次又把Label這貨拉出來鞭一鞭。
我先創建一個label
- std::string star_str = "star is not star in the sky,it is on heart";//先定義一個string
- auto m_label = LabelTTF::create(star_str,"Arial",25);//創建一個label
- m_label->setPosition(Point(300,300));
- this->addChild(m_label,2);
- m_label->setDimensions(Size(200,200));//設置label的尺寸
上面這種方法固然方便,但還是有它的侷限性:假如我們做的是一個類似微信的聊天對話框,這種對話框一個特點就是會隨著你文字長度的改變而改變。而如果我們在這裡講Label的尺寸給寫死了,那對話框也就跟著失去它的靈活性了。
這裡有沒有更酷的解決辦法麼?答案是肯定的。
LabelTTF有一個好處就是會在字符串中有"\n"的地方換行,利用這個特點可以寫一個自動換行的函數,參考代碼如下:
//str是傳入的字符串,length是每行的長度
- std::string HelloWorld::myWrap(std::string str,int length)
- {
- unsigned int beginPos = 0; //字符串的初始位置
- std::string resultStr; //返回的字符串
- std::vector<std::string > str_vec; //創建一個字符串類型的順序容器
- do
- {
- str_vec.push_back(str.substr(beginPos,length)); //substr函數的作用類似剪刀,將str中從beginPos到length之間的字符串剪下來,單獨放入容器中
- if (beginPos+length >str.size())
- {
- break; //當要裁剪的長度超出str的長度,則退出循環
- }
- else
- {
- beginPos += length;
- }
- } while (true);
- for (unsigned int i = 0;i<str_vec.size();++i)
- {
- resultStr.append(str_vec.at(i)).append("\n"); //從容器逐一取出之前裁剪好的一段段字符串,分別在字符串後面加上換行符。append()類似膠水,將\n粘到字符串後面
- }
- // resultStr.pop_back(); //這一句是將最後一個多餘的\n給刪掉
- return resultStr;
- }
現在用這種方法重寫一次label的創建過程
- std::string star_str = "star is not star in the sky,it is on heart";//先定義一個string
- auto m_label = LabelTTF::create(myWrap(star_str,10),"Arial",25);//創建一個label
- m_label->setPosition(Point(300,300));
- this->addChild(m_label,2);
結果如下圖所示:
恩,就醬紫啦。
尊重原創,轉載請註明來源:
http://shahdza.blog.51cto.com/2410787/1560612
原文還有更多功能 這邊僅僅節錄換行
【自動換行】
在3.x中,自動換行有兩種方式。(當然你也可以使用C++裡的轉移字符'\n'進行手動換行)
> 利用lb->setLineBreakWithoutSpace(true),來支持自動換行功能。
> 1. 利用 setMaxLineWidth(maxLineWidth),來控制自動換行。
> 2. 利用 setDimensions(width , height),來控制自動換行。
1、利用setMaxLineWidth
設置每行顯示文字的最大寬度。
註:這種方法僅在Label width == 0的情況下,才會有效。
使用方法:
1
2
3
4
| // lb->setLineBreakWithoutSpace( true ); lb->setMaxLineWidth(120); //最大寬度120 // |
如圖:
2、利用setDimensions
使用方法:
1
2
3
4
5
| // lb->setLineBreakWithoutSpace( true ); lb->setWidth(80); //設置Label尺寸寬80 lb->setMaxLineWidth(120); //設置了Label width,這個就無效了 // |
如圖:
【文字間距】
間距的調整,是在 v3.2 之後才出現的。可以設置文本內容的行間距與文字間距。
註:不支持System Font。
> setLineHeight : 設置行間距
> setAdditionalKerning : 設置額外文字間距
使用舉例:
1
2
3
4
| // lb->setLineHeight(80); lb->setAdditionalKerning(10); // |
圖解:
沒有留言:
張貼留言