11

iBooks アプリを見て、テキスト (おそらく非常に単純な txt ファイル) をフォーマットして、スクロール可能ではなく別々のページに分割する方法を知りたいと思っていました。

同じことを達成したいのですが、編集可能なテキストのみを使用します。

どこから始める必要がありますか?UITextView はスクロールすると機能しません。pagingEnabled プロパティを YES に設定しても、うまくいきません。

特定のページに配置できるテキストの量を制限する必要があるようです。UITextViewの入力を制限する機能はありますか? LINES (文字ではない) の数を iPhone の全画面に表示されるように制限する必要があります (フォント サイズにもよりますが、20 行程度に収まると思います)。

どんな助けでも大歓迎です!私は初心者なので、同様の方法が使用されているサンプルを特に高く評価しています。

ありがとう!

4

2 に答える 2

2

必要なのは、テキストを取得し、そのサイズを測定して、1 ページのテキスト ビューに収まるまで切り取る独自のレイアウト アルゴリズムです。次に、残りのテキストから始めます。次のテキスト ビューでも同じことを行います。その後 (またはアルゴリズム内で)、結果のすべてのテキスト ビューをスクロール ビューに配置します (または配列で、後でめくります)。ページングアニメーション付き-安っぽいのが好きなら)。私も同様のことをしましたが、UILabels を使用すると、テキストビューでも動作するはずです。必要なのは: NSString's - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)sizeand 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
于 2011-03-08T17:58:10.827 に答える
0

ソース コードは見ていませんが、 CoreText フレームワークを使用してページ付けとレンダリングを行っていることは保証したいと思います。ただし、「低レベル」と記載されている場合は、それを意味することに注意してください。これは、文字のレンダリングを直接処理するフレームワークです。文字の選択や挿入 (おそらく編集可能なテキストに必要) などは、CoreText では非常に困難です。

UIKit フレームワークの一部であるNSString描画とサイズ変更の方法を使用することをお勧めします。しかし、それでも、これを機能させるにはかなりの作業を行う必要があります。UIKit がスクロールしないテキスト編集コントロールを提供しているとは思いません。テキストを編集したい場合、テキストは任意の長さになると想定しています。つまり、スクロール可能なコンテナー内にテキストを配置します (任意の長さにできるようにします)。

一言で言えば、あなたが初心者なら、別のことに取り組むことをお勧めします。あなたが求めていることは、簡単なことではありません。:)

于 2011-03-08T20:35:48.190 に答える