5

各段落を配置するために 4 つの UITextview を使用しました。次に、各 UITextview のサブビューとして UIButton を追加します。

フレームを使用してサブビューを作成することCGRectMake(textview.frame.width-50,textview.frame.height-20,50,20)は理想的な解決策ではないことに気付きました。文はどこでも終了する可能性があるためです。つまり、段落の最後の文字はどこでも終了する可能性がありますが、その位置は一定ではありません。

要するに、lats という単語のすぐ隣にUIButtonある , 内に追加したいということです。UITextViewそれ、どうやったら出来るの?

どんな解決策でも大歓迎です。:)

4

3 に答える 3

5

それほど単純ではありません。使用:

CGSize sizeOfString = [string sizeWithFont:self.aTextView.font constrainedToSize:self.aTextView.frame.size];

指定された文字列の CGSize を取得できます。ただし、文字列全体を指定すると、UITextView のサイズ (つまり、右下隅) と同じサイズになります。

各 UITextField の最後の行でこのメソッドを使用する必要があります...これは難しい部分です。ワードラップはCoreText、UITextView、またはUILabelによって行われ、単一行、位置などに関する情報は提供されません.

同様のことをして自分で計算する必要があります (コードはあまりきれいではありません。理解に問題がある場合は、後でお手伝いします)。

NSAttributedString* text = self.aTextView.attributedText;
CTFramesetterRef fs =
CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)text);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0,0,self.aTextView.frame.size.width - 16,100000));  // why the -16? the frame should be the REAL TEXT FRAME, not the UITextView frame. If you look, there is a space between the view margin and the text. This is the baseline. Probably there is a method to calculate it programatically, but I can't check now. In my case it seems like 8px (*2)
CTFrameRef f = CTFramesetterCreateFrame(fs, CFRangeMake(0, 0), path, NULL);
CTFrameDraw(f, NULL);

NSRange lastRange;
NSArray* lines = (__bridge NSArray*)CTFrameGetLines(f);

id lastLineInArray = [lines lastObject];
CTLineRef theLine = (__bridge CTLineRef)lastLineInArray;
CFRange range = CTLineGetStringRange(theLine);
lastRange.length = range.length;
lastRange.location = range.location - 1;
NSLog(@"%ld %ld", range.location, range.length);

CGPathRelease(path);
CFRelease(f);
CFRelease(fs);

// this is the last line
NSString *lastLine = [self.aTextView.text substringWithRange:lastRange];

これで、次を使用できます。

CGSize sizeOfString = [lastLine sizeWithFont:self.aTextView.font constraintToSize:self.aTextView.frame.size];

文字列の幅と高さを取得してから、ボタンの最終的な位置を取得します (y 位置の場合: 行配列カウントから取得した行数 * 文字列の高さ)

編集: UITextView の左スペースに関するコメント (この行に -16 がある理由)

CGPathAddRect(path, NULL, CGRectMake(0,0,self.aTextView.frame.size.width - 16,100000));

これは、テキストが実際には UITextView 内にあるのではなく、そのサブビューの 1 つである、インセットを追加する UIWebDocumentView (プライベート クラス) 内にあるために発生します。いくつかの検索の後、CGPathAddRect() 関数に正しい四角形を渡すために必要な、このインセットの値を (合法的に) 取得する方法が見つかりません。常に8ptであることを確認するためにいくつかのテストを行うことができます:-)またはそのコンテンツインセットを持たないUILabelに切り替えます

于 2013-01-18T18:35:33.043 に答える
0

UIWebView またはそのような機能をサポートするサード パーティの属性付きテキスト ビューの使用を検討する必要があります。

UITextView は内部的に Web ビューを使用するため、テキストの正確なレイアウトを把握するのは簡単ではありません。

于 2013-01-16T11:36:38.043 に答える
-2

私は、tableViewを使用するためのより良い方法だと思います。1つのセルに1つの段落。境界線のないセルを作成し、clearColorをセルの背景に設定します。このようにして、ボタンを簡単に追加できます。

于 2013-01-18T14:19:45.980 に答える