公告类型:可变的滚动视图,文字长度根据制定长度进行换行

最近由于功能的需求,写了一个容器可变的滚动视图,文字长度也是从网上找的,

这个Demo的效果是这样的:

在一个指定大小的背景图上边,点击按钮,出现一条信息,(每次的信息长度不固定),这条信息出现在背景图的ScrollView上,当信息没有占满ScrollView的大小时,它是不可以滚动的,然后再点击按钮,再往这条信息的下方出现一条信息,最后当信息占满ScrollView时,会自动向上滚动,ScrollView的大小也会自动根据信息的长度而改变。

下面贴一下源码:

struct tagNoticeInfo

{

CCLabelTTF* labelNotice;

float fWidth;

};

.h文件

void loadScrollView();

void showNotice(std::string noticeStr);

CCLabelTTF* HorizontalSpacingANDVerticalSpacing(std::string _string,
const char *fontName,
float fontSize, float horizontalSpacing,
float verticalSpacing, float lineWidth);

//CCScrollView

CCLayer* m_layerScrollContain;

CCScrollView* m_scrollViewNotice;

std::vector<tagNoticeInfo> m_vctPriseInfo;

.cpp文件

void CBonusLayer::loadScrollView()

{

m_scrollViewNotice =
CCScrollView::create();

m_layerScrollContain =
CCLayer::create();//创建一个层,作为滚动的内容

m_layerScrollContain->setPosition(ccp(0,0));

m_layerScrollContain->setAnchorPoint(ccp(0,
0));

m_layerScrollContain->setContentSize(CCSizeMake(360,
500));

m_scrollViewNotice->setPosition(ccp(10,
25));

m_scrollViewNotice->setAnchorPoint(ccp(0,
0));

m_scrollViewNotice->setContentOffset(ccp(0,500-250));

m_scrollViewNotice->setViewSize(CCSizeMake(360,
500));//设置view的大小

m_scrollViewNotice->setContentSize(CCSizeMake(360,
500));

m_scrollViewNotice->setContainer(m_layerScrollContain);

m_scrollViewNotice->setBounceable(false);

m_scrollViewNotice->setDelegate(this);

m_scrollViewNotice->setTouchPriority(-200);

m_scrollViewNotice->setDirection(kCCScrollViewDirectionVertical);

m_spPriseList ->
addChild(m_scrollViewNotice);

}

void CBonusLayer::showNotice(std::string noticeStr)

{

//计算公告的位置

int count =
m_vctPriseInfo.size();

float height =
0;

for(unsigned
int i = 0; i < count; i++)

{

tagNoticeInfo NoticeInfo = (tagNoticeInfo)m_vctPriseInfo[i];

float width = NoticeInfo.fWidth;

height = height + width/340.0*40+40;//每一个公告的高度

}

tagNoticeInfo NoticeInfo;

NoticeInfo.labelNotice=
CCLabelTTF::create(noticeStr.c_str(),
"Arial", 32);

NoticeInfo.fWidth = NoticeInfo.labelNotice->getContentSize().width;

NoticeInfo.labelNotice =
HorizontalSpacingANDVerticalSpacing(NoticeInfo.labelNotice->getString(),
"Arial", 32,
1.5, 1,
340);

float fY = height + NoticeInfo.fWidth/340.0*40+80;

printf("fY is %f\n", fY);

//计算面板是否可以滚动,而且滚动的范围也要加以限制

if(fY <
500)

{

m_scrollViewNotice->setTouchEnabled(false);

NoticeInfo.labelNotice ->
setPosition(ccp(10,500-40
- height));

}

else

{

m_scrollViewNotice->setTouchEnabled(true);

m_layerScrollContain->setContentSize(CCSizeMake(360,
fY));

m_layerScrollContain->setPosition(ccp(0,0));

m_scrollViewNotice->setContentSize(CCSizeMake(360,
fY));

NoticeInfo.labelNotice ->
setPosition(ccp(10,(NoticeInfo.fWidth/340.0*40+40)));

float width =
0;

for(unsigned
int i = 0; i <
m_vctPriseInfo.size(); i++)

{

tagNoticeInfo NoticeInfo = (tagNoticeInfo)m_vctPriseInfo[i];

width = width + NoticeInfo.fWidth/340.0*40+40;

NoticeInfo.labelNotice ->
setPosition(ccp(10,fY-width+NoticeInfo.fWidth/340.0*40));

}

}

NoticeInfo.labelNotice ->
setAnchorPoint(ccp(0,0.5f));

m_layerScrollContain ->
addChild(NoticeInfo.labelNotice);

m_vctPriseInfo.push_back(NoticeInfo);

}

CCLabelTTF* CBonusLayer::HorizontalSpacingANDVerticalSpacing(std::string
_string, const char *fontName,
float fontSize, float horizontalSpacing,
float verticalSpacing, float lineWidth)

{

CCArray* labelTTF_arr =
CCArray::create();

int index =
0;

int index_max =
strlen(_string.c_str());

bool is_end =
true;

while (is_end) {

if (_string[index] >=
0 && _string[index] <=
127) {

std::string englishStr = _string.substr(index,1).c_str();

const
char* englishChar = englishStr.c_str();

labelTTF_arr->addObject(CCLabelTTF::create(englishChar, fontName, fontSize));

index+= 1;

}

else{

std::string chineseStr = _string.substr(index,3).c_str();

const
char* chineseChar =  chineseStr.c_str();

labelTTF_arr->addObject(CCLabelTTF::create(chineseChar, fontName, fontSize));

index+= 3;

}

if (index>=index_max) {

is_end=false;

}

}

//以上步骤是根据ASCII码找出中英文字符,并创建成一个CCLabelTTF对象存入labelTTF_arr数组中。

//下面创建的原理是在CCLabelTTF对象上添加子对象CCLabelTTF,以此组合成一句话,以左上角第一个字为锚点。。

CCLabelTTF* returnTTF = (CCLabelTTF*)labelTTF_arr->objectAtIndex(0);

returnTTF->setColor(ccc3(116,
0, 0));

float nowWidth = returnTTF->getContentSize().width;

CCLabelTTF* dangqiangTTF = returnTTF;

CCLabelTTF* lineBeginTTF = returnTTF;

int arr_count = labelTTF_arr->count();

for (int i=1; i < arr_count; i++) {

CCLabelTTF* beforeTTF = (CCLabelTTF*)labelTTF_arr->objectAtIndex(i);

beforeTTF->setColor(ccc3(116,
0, 0));

beforeTTF->setAnchorPoint(ccp(0,
0.5));

nowWidth+=beforeTTF->getContentSize().width;

if (nowWidth >= lineWidth) {

nowWidth = returnTTF->getContentSize().width;

dangqiangTTF = lineBeginTTF;

beforeTTF->setPosition(ccp(0, -dangqiangTTF->getContentSize().height*0.5-verticalSpacing));

lineBeginTTF = beforeTTF;

}else{

beforeTTF->setPosition(ccp(dangqiangTTF->getContentSize().width+horizontalSpacing,
dangqiangTTF->getContentSize().height*0.5));

}

dangqiangTTF->addChild(beforeTTF);

dangqiangTTF = beforeTTF;

}

return returnTTF;

}

时间: 2024-10-29 12:49:42

公告类型:可变的滚动视图,文字长度根据制定长度进行换行的相关文章

滚动ScrollView---数组存放图片,设置3个滚动视图,用来滑动多张图片

问题描述:循环滑动切换n多张图片,不事先加载完成,现用现取. 解题思路:将要显示的图片存放在数组中,设置3个滚动视图,左边视图,正在显示的视图,右边视图 实现代码如下: //  ViewController.m #import "ViewController.h" #define kWith self.view.frame.size.width #define kHeight self.view.frame.size.height @interface ViewController (

iOS学习笔记——滚动视图(scrollView)

滚动视图:在根视图中添加UIScrollViewDelegate协议,声明一些对象属性 @interface BoViewController : UIViewController<UIScrollViewDelegate> //滚动视图对象 @property (retain, nonatomic) UIScrollView *scrollView; //视图中小圆点,对应视图的页码 @property (retain, nonatomic) UIPageControl *pageContr

Xamarin iOS教程之进度条和滚动视图

Xamarin iOS教程之进度条和滚动视图 Xamarin iOS 进度条 进度条可以看到每一项任务现在的状态.例如在下载的应用程序中有进度条,用户可以很方便的看到当前程序下载了多少,还剩下多少.QQ音乐播放器中也使用到了进度条,它可以让用户看到当前音乐播放了多少,还剩多少等.在Xamarin.iOS中也提供实现进度条的类,即UIProgressView. [示例2-23]以下将实现进度条加载的效果.具体步骤如下: (1)创建一个Single View Application类型的工程,命名为

【转载】cocos2dx基础篇(16)——滚动视图CCScrollView

[唠叨] 本节要讲讲滚动视图CCScrollView,相信玩过手游的同学们应该对它不会陌生吧. 例如:愤怒的小鸟的游戏场景里大大的地图,手机的屏幕肯定无法完全显示的,所以需要通过触摸滚动才能显示大地图的其他区域:排行榜中上下滑动来查看其他玩家的排名:以及手机上主界面左右滑动来切换界面等等. 如下图为屏幕滚动,切换手机的界面. [致谢] http://blog.csdn.net/paea_gulang/article/details/10283601 [Demo下载] https://github

cocos2dx基础篇(16)——滚动视图CCScrollView

[唠叨] 本节要讲讲滚动视图CCScrollView,相信玩过手游的同学们应该对它不会陌生吧. 例如:愤怒的小鸟的游戏场景里大大的地图,手机的屏幕肯定无法完全显示的,所以需要通过触摸滚动才能显示大地图的其他区域:排行榜中上下滑动来查看其他玩家的排名:以及手机上主界面左右滑动来切换界面等等. 如下图为屏幕滚动,切换手机的界面. [致谢] http://blog.csdn.net/paea_gulang/article/details/10283601 http://bbs.firedragonpz

Android零基础入门第61节:滚动视图ScrollView

原文:Android零基础入门第61节:滚动视图ScrollView 前面几期学习了ProgressBar系列组件.ViewAnimator系列组件.Picker系列组件和时间日期系列组件,接下来几期继续来学习常见的其他组件. 一.ScrollView概述 从前面的学习有的同学可能已经发现,当拥有很多内容时屏幕显示不完,显示不全的部分完全看不见.但是在实际项目里面,很多内容都不止一个屏幕宽度或高度,那怎么办呢?那就需要本节学习的ScrollView来完成. 在默认情况下,ScrollView只是

Cocos2d-X使用CCScrollView创建滚动视图

CCScrollView可以使游戏有滚动视图的效果,并且可以通过滚动视图切换游戏场景,滚动视图常用于游戏中选择关卡 实例1:使用CCScrollView创建一个简单的滚动视图 首先创建一个ScrollView类 然后在ScrollView.h中添加下面的代码 #ifndef __ScrollView_H__ #define __ScrollView_H__ #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC

UIScrollView 按页面滚动视图 UIPageControl

1.UIScrollView是可以滚动的view,UIView本?身不能滚动,子类UIScrollview拓展了滚动?方?面的功能. 2.UIScrollView是所有滚动视图的基类.以后的UITableView,UITextView等视图都是继承于该类. 3.UIScrollview主要专?长于两个?方?面: (1).滚动:contentSize?大于frame.size的时候,能够滚动. (2).缩放:?自带缩放,可以指定缩放倍数. UIScrollView滚动的相关属性 1.content

滚动视图性能优化的几种方式

目的: - 我们每次发布IOS时都会有一些新特性页面,当然还有广告条都会用到滚动视图.那么如何性能优化呢?目前就我所知有两种方案,一种就是常用的2-3张图片重复利用,另一种就是今天主要讲的利用UICollectionView来做. - 今天就做一个新特性页面为例 步骤: 方法一:利用UICollectionView 1.UICollectionView继承UIScrollView,我们要用滚动视图,肯定会用到ScrollView,而如何我们把collectionView中的一个Item当作滚动视