-(NSArray*)getPagesOfString:(NSString*)cache withFont:(UIFont*)font inRect:(CGRect)r{ //返回一个数组, 包含每一页的字符串开始点和长度(NSRange) NSMutableArray *ranges=[NSMutableArray array]; //显示字体的行高 CGFloat lineHeight=[@"Sample样本" sizeWithFont:font].height; NSInteger maxLine=floor(r.size.height/lineHeight); NSInteger totalLines=0; NSLog(@"Max Line Per Page: %d (%.2f/%.2f)",maxLine,r.size.height,lineHeight); NSString *lastParaLeft=nil; NSRange range=NSMakeRange(0, 0); //把字符串按段落分开, 提高解析效率 NSArray *paragraphs=[cache componentsSeparatedByString:@"/n"]; for (int p=0;p< [paragraphs count];p++) { NSString *para; if (lastParaLeft!=nil) { //上一页完成后剩下的内容继续计算 para=lastParaLeft; lastParaLeft=nil; }else { para=[paragraphs objectAtIndex:p]; if (p<[paragraphs count]-1) para=[para stringByAppendingString:@"/n"]; //刚才分段去掉了一个换行,现在还给它 } CGSize paraSize=[para sizeWithFont:font constrainedToSize:r.size lineBreakMode:lineBreakMode]; NSInteger paraLines=floor(paraSize.height/lineHeight); if (totalLines+paraLines<maxLine) { totalLines+=paraLines; range.length+=[para length]; if (p==[paragraphs count]-1) { //到了文章的结尾 这一页也算 [ranges addObject:[NSValue valueWithRange:range]]; //IMILog(@”===========Page Over=============”); } }else if (totalLines+paraLines==maxLine) { //很幸运, 刚好一段结束,本页也结束, 有这个判断会提高一定的效率 range.length+=[para length]; [ranges addObject:[NSValue valueWithRange:range]]; range.location+=range.length; range.length=0; totalLines=0; //IMILog(@”===========Page Over=============”); }else{ //重头戏, 页结束时候本段文字还有剩余 NSInteger lineLeft=maxLine-totalLines; CGSize tmpSize; NSInteger i; for (i=1; i<[para length]; i++) { //逐字判断是否达到了本页最大容量 NSString *tmp=[para substringToIndex:i]; tmpSize=[tmp sizeWithFont:font constrainedToSize:r.size lineBreakMode:lineBreakMode]; int nowLine=floor(tmpSize.height/lineHeight); if (lineLeft<nowLine) { //超出容量,跳出, 字符要回退一个, 应为当前字符已经超出范围了 lastParaLeft=[para substringFromIndex:i-1]; break; } } range.length+=i-1; [ranges addObject:[NSValue valueWithRange:range]]; range.location+=range.length; range.length=0; totalLines=0; p--; //IMILog(@”===========Page Over=============”); } } return [NSArray arrayWithArray:ranges]; }
您还没有登录,请您登录后再发表评论
每个单元格可以包含一个UILabel用于显示标题,如果需要,还可以添加图片、时间戳等元素。使用AutoLayout确保界面在不同屏幕尺寸上都能适配。 2. **数据模型**:为了存储新闻数据,我们需要创建一个数据模型,比如`...
3. **UIKit框架**:UIKit是iOS应用程序的核心框架,书中会介绍如何使用UIViewController管理屏幕内容,使用UIViews创建各种视图元素,如UILabel、UIButton、UIImageView等,以及如何处理用户交互。 4. **Storyboard...
在Xcode项目中,你需要导入Contacts框架。这可以通过在你的Swift文件顶部添加以下代码完成: ```swift import Contacts ``` 步骤二:获取联系人权限 在iOS中,访问用户的数据需要得到用户的明确许可。因此,你需要...
本书将详细介绍UIView类及其子类,如UILabel、UIButton、UIImageView等,如何创建、布局和自定义视图,以及如何利用Auto Layout进行响应式设计,确保应用在不同设备上都能正确显示。 2. 视图控制器(View ...
每个.nib文件对应于一个界面,可以包含一个或多个UIViewController实例,以及其他UI元素如UILabel、UIButton等。开发者可以在Interface Builder中直观地设计和布局界面,然后在运行时加载这些.nib文件。 相比之下,...
- 可以通过继承`UITableViewCell`来创建自定义的单元格类,添加自定义的UI元素如UILabel、UIImageView等。 - 在Xcode中使用Interface Builder设计自定义单元格,通过`IBOutlet`连接UI元素,并在代码中设置它们的...
在Xcode中,我们可以在Storyboard或代码中创建一个`UITableView`。如果你选择在Storyboard中创建,记得设置好TableView的约束,确保其位置和大小正确。在代码中,你可以使用`UITableView(frame: CGRect, style: ...
通过修改`UILabel`、`UIButton`等组件的属性,定制界面的视觉风格。 10. **测试和调试**:确保所有功能在各种情况下都能正常工作,包括横竖屏切换、不同设备尺寸等。使用Xcode的调试工具进行性能优化和错误排查。 ...
开发者可能使用Xcode IDE进行项目开发,Xcode提供了集成的开发环境,包括源代码编辑器、调试器、模拟器等工具。项目的代码可能遵循MVC(Model-View-Controller)设计模式,将数据、显示和用户交互逻辑分离,以保持...
- **UIPageViewController**:UIPageViewController是用于创建分页视图控制器的理想选择。 #### 22. Tab Bar探索与Storyboard引用 - **Tab Bar**:Tab Bar是一种常见的导航控件,用于提供多个主要功能的入口。 - *...
为了使用FTMoreApps,首先你需要将`FTMoreApps-master`压缩包解压,然后将其中的源码导入到你的Xcode项目中。这个库可能包含以下关键组件: 1. `FTMoreAppsViewController`: 这是主要的视图控制器类,包含了展示...
相关推荐
每个单元格可以包含一个UILabel用于显示标题,如果需要,还可以添加图片、时间戳等元素。使用AutoLayout确保界面在不同屏幕尺寸上都能适配。 2. **数据模型**:为了存储新闻数据,我们需要创建一个数据模型,比如`...
3. **UIKit框架**:UIKit是iOS应用程序的核心框架,书中会介绍如何使用UIViewController管理屏幕内容,使用UIViews创建各种视图元素,如UILabel、UIButton、UIImageView等,以及如何处理用户交互。 4. **Storyboard...
在Xcode项目中,你需要导入Contacts框架。这可以通过在你的Swift文件顶部添加以下代码完成: ```swift import Contacts ``` 步骤二:获取联系人权限 在iOS中,访问用户的数据需要得到用户的明确许可。因此,你需要...
本书将详细介绍UIView类及其子类,如UILabel、UIButton、UIImageView等,如何创建、布局和自定义视图,以及如何利用Auto Layout进行响应式设计,确保应用在不同设备上都能正确显示。 2. 视图控制器(View ...
每个.nib文件对应于一个界面,可以包含一个或多个UIViewController实例,以及其他UI元素如UILabel、UIButton等。开发者可以在Interface Builder中直观地设计和布局界面,然后在运行时加载这些.nib文件。 相比之下,...
- 可以通过继承`UITableViewCell`来创建自定义的单元格类,添加自定义的UI元素如UILabel、UIImageView等。 - 在Xcode中使用Interface Builder设计自定义单元格,通过`IBOutlet`连接UI元素,并在代码中设置它们的...
在Xcode中,我们可以在Storyboard或代码中创建一个`UITableView`。如果你选择在Storyboard中创建,记得设置好TableView的约束,确保其位置和大小正确。在代码中,你可以使用`UITableView(frame: CGRect, style: ...
通过修改`UILabel`、`UIButton`等组件的属性,定制界面的视觉风格。 10. **测试和调试**:确保所有功能在各种情况下都能正常工作,包括横竖屏切换、不同设备尺寸等。使用Xcode的调试工具进行性能优化和错误排查。 ...
开发者可能使用Xcode IDE进行项目开发,Xcode提供了集成的开发环境,包括源代码编辑器、调试器、模拟器等工具。项目的代码可能遵循MVC(Model-View-Controller)设计模式,将数据、显示和用户交互逻辑分离,以保持...
- **UIPageViewController**:UIPageViewController是用于创建分页视图控制器的理想选择。 #### 22. Tab Bar探索与Storyboard引用 - **Tab Bar**:Tab Bar是一种常见的导航控件,用于提供多个主要功能的入口。 - *...
为了使用FTMoreApps,首先你需要将`FTMoreApps-master`压缩包解压,然后将其中的源码导入到你的Xcode项目中。这个库可能包含以下关键组件: 1. `FTMoreAppsViewController`: 这是主要的视图控制器类,包含了展示...