看看iBooks应用程序,我想知道如何完成格式化文本(可能是一个非常简单的txt文件),这样它就不可滚动,而是分成不同的页面。
我希望达到相同的效果,但只能使用可修改的文字。
我需要从哪里开始? UITextView在滚动时不起作用。即使我将pagingEnabled属性设置为YES,它也不会执行该任务。
似乎我需要限制我可以放在某个页面上的文本数量。是否有一个限制UITextView输入的功能?我需要限制LINES(不是字符)的数量,因为它们将显示在完整的iPhone屏幕上(我猜你可以容纳20行左右,具体取决于字体大小)。
任何帮助将不胜感激!由于我是初学者,我特别欣赏使用类似方法的样本。
谢谢!
答案 0 :(得分:2)
你需要的是一种自己的布局算法,它采用文本,测量文本大小并将其剪切,直到它适合单页文本视图。然后从文本的其余部分开始,对于下一个文本视图同样的事情,依此类推......在那之后(或算法内部),您可以在滚动视图上排列所有生成的文本视图(或者在数组中,您稍后翻阅分页动画 - 如果你喜欢俗气的话。我做了类似的事情,但是对于UILabels,它也应该与textviews一起使用。您需要的是:NSString's - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
和r angeOfString:@" " options:NSBackwardsSearch
(寻找单词空格)和substringFromIndex:
resp。 substringToIndex:
如果您需要更多信息,请发表评论。
修改强>:
嗨下面的代码没有经过测试,但包含了你需要的大部分内容(希望如此),但可能会有一些错误,特别是在递归时......我纠正了BackWardsSearch的想法,因为它可能需要花费很长时间才能完成剪了很长的文字。我完全忽略了 - 这可能非常棘手 - 是在编辑时重新渲染。 但无论如何,这是代码。 它是一个视图控制器,假设为旧的4个成员(头文件未发布):
UIView *editableBook;
NSMutableArray *content;
int currentPage;
UIFont *font;
这是控制器本身:
//
// EditableBookController.m
//
// Created by Kai on 09.03.11.
//
#import "EditableBookController.h"
@implementation EditableBookController
-(id)initWithText:(NSString *)text
{
if (self=[super init])
{
font = [UIFont fontWithName:@"SomeFont" size:12];
content = [[NSMutableArray alloc]init];
[self cutInPages:text];
currentPage = 0;
}
return self;
}
- (void)loadView
{
self.view = [[UIView alloc] initWithFrame:CGRectMake(.0, .0, 768., 1024.)];//assuming portrait only ...
editableBook = [[UIView alloc]initWithFrame:self.view.bounds];//could be a scroll view in alternate approach
UISwipeGestureRecognizer *flipper = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(nextOrPrevious:)];
[editableBook addGestureRecognizer:flipper];
[flipper release];
[self.view addSubview:editableBook];
UITextView *textView = [[UITextView alloc]initWithText:[content objectAtIndex:currentPage]];
textView.frame = editableBook.bounds;
textView.font = font;
textView.tag = 23;
[editableBook addSubview:textView];
[textView release];
}
-(void)nextOrPrevious:(id)sender
{
UISwipeGestureRecognizer *flipper = (UISwipeGestureRecognizer*)sender;
if(flipper.direction == UISwipeGestureRecognizerDirectionLeft)
{
[self next];
}
else if(flipper.direction == UISwipeGestureRecognizerDirectionRight)
{
[self previous];
}
}
-(void)next
{
if(currentPage == content.count - 1)
{
return;
}
currentPage++;
UIView *fromView = [editableBook viewWithTag:23];
UIView *toView = [[UITextView alloc]initWithText:[content objectAtIndex:currentPage]];
toView.frame = editableBook.bounds;
toView.tag = 23;
[UIView transitionWithView:editableBook duration:0.2 options:UIViewAnimationTransitionFlipFromRight
animations:^
{
[fromView removeFromSuperview];
[editableBook addSubview:toView];
}
completion:NULL];
}
-(void)previous
{
if(currentPage == 0)
{
return;
}
currentPage--;
UIView *fromView = [editableBook viewWithTag:23];
UIView *toView = [[UITextView alloc]initWithText:[content objectAtIndex:currentPage]];
toView.frame = editableBook.bounds;
toView.tag = 23;
[UIView transitionWithView:editableBook duration:0.2 options:UIViewAnimationTransitionFlipFromLeft
animations:^
{
[fromView removeFromSuperview];
[editableBook addSubview:toView];
}
completion:NULL];
}
-(void)cutInPages:(NSString *)text
{
NSRange whereToCut = whereToCut = [text rangeOfString:@" "];
NSString *pageText = [text substringToIndex:whereToCut.location];
NSString *rest = [text substringFromIndex:whereToCut.location];;
CGFloat height = 0;
while (height<1024.)
{
NSRange whereToCut = [rest rangeOfString:@" "];
NSString *wordOfRest = [rest substringToIndex:whereToCut.location];
pageText = [NSString stringWithFormat:@"%@%@", pageText, wordOfRest];
rest = [rest substringFromIndex:whereToCut.location];;
CGSize size = [pageText sizeWithFont:font
constrainedToSize:CGSizeMake(768., 10000)
lineBreakMode:UILineBreakModeWordWrap];
height = size.height;
}
if(height>1024.)
{
//TODO cut the last word of pageText and prepend to the eest
}
[content addObject:pageText];
if([rest length] > 0)
{
[self cutInPages:rest];
}
}
- (void)dealloc
{
[editableBook release];
[content release];
[super dealloc];
}
@end
答案 1 :(得分:0)
我还没有看到源代码,但我愿意保证他们正在使用CoreText framework进行分页和渲染。但是要注意,当它说“低级别”时,就意味着。这是一个处理直接渲染字符的框架。使用CoreText时,字符选择和插入(您可能需要可编辑文本)的内容非常困难。
我建议使用属于UIKit框架的NSString
drawing and sizing methods。但即便如此,你仍然需要做很多工作才能实现这一功能。我认为UIKit不提供不滚动的文本编辑控件。我们假设如果你想编辑文本,它将具有任意长度,这意味着我们将它放在一个可滚动的容器中(这样它可以是任何长度)。
简而言之,如果你是初学者,我会建议你做其他事情。你所要求的并不是一件容易的事。 :)