問題タブ [nslayoutmanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1249 参照

objective-c - 垂直レイアウトに関して NSLayoutManager と NSTextContainer の動作を明確にしますか?

コードサンプル

NSLayoutManager, NSTextContainer & NSTextStorage次のように初期化されたカスタムNSView(TextView ではない)にas プロパティがありawakeFromNib()ます。

containerSizeレンダリングされるテキストを非表示にする効果があるかどうかを確認するために、の垂直方向NSTextContainerは意図的に 1 に設定されていますが、そうではありません! ビューでのこのテキストのレンダリングに違いはありません-これが質問の主題です!

drawRectテキストを描画するために以下の行を含めます。

所見

  1. 反転した座標系でカスタム ビューを操作するのが最善のようです。他の方法NSTextViewでは、苦痛の世界に陥りそうな気がします。これに関係なく、NSLayoutManager は常に反転した座標系で内部的にテキストの描画を開始します (のようにNSTextView) 。
  2. containerSize.widthプロパティにNSTextContainerは次の効果があります。最初のレベルを含むすべてのレベルの行レベルでバインドされます (明らかだとわかっていますが、私に固執してください...)
  3. containerSize.heightプロパティにNSTextContainerはカーブボールがあります。含まれているビューに垂直に表示する余地がない場合でも、最初の行ではバインドされませんが、後続の行ではバインドされます

containerSize.height*線を一本しか引いていなかったので、この仮説にたどり着くまでに長い時間がかかりました! *

質問

  1. に関する私の結論はNSTextContainer正しいですか?
  2. 垂直方向の視点からテキスト描画を制御する最良の方法は何ですか? テキストの 1 行をビューの下部に配置したいと考えています (デフォルトのように上部に浮かせません)。
0 投票する
1 に答える
1882 参照

cocoa - NSStackView places NSViews on the baseline

Having reviewed most of Apple's (paucity) of documentation regarding NSStackView, plus the wise words of the greater Internet, including the collective wisdom of Stackoverflow, a problem remains.

Any NSView I add programmatically to my (IB instantiated) NSStackView, visually locate themselves to the bottom of their respective gravity area. Hence they overlay each other and don't behave like an expected "stack" of views with appropriate spacing.

Each of the gravity areas seem somehow compressed and unable to accommodate any more views. The more I apply NSStackView.addView to a gravity area the slimmer the existing views become.

I would expect NSStackView to naturally expand to accommodate the .size of the embedded views.

Any wise counsel is most appreciated ...

---more details—</p>

I place the StackView into the main window using interface builder. I can then add other views into areas of the stack in interface builder, such as buttons. These stack and layout as expected in IB and when running.

However, when I add or insert any view programmatically to any gravity area their bottom edge is positioned vertically down to the bottom edge of the StackView. This layout behaviour is the same for a vertical or horizontal stack.

Consequently, if I add more than one view programmatically they are sized OK and display but overlap. I am using 'NSBox' objects as views (for now) and they are sized using '.sizeToFit()'. I can see that their '.bounds.height' and 'width' are non zero.

I'm not sure how to set or log the intrinsic content size. That might be the next thing to try.

—no luck—

So, I have now worked rigorously through all permutations of: compression, hugging, (non-zero) intrinsic sizing, constraints, no constraints and various types of NSViews, but ... if I '.addView(...)' or '.insertView(...)' more than once, in any 'NSStackView' gravity area, the subsequent views overlay the previous ones and position themselves on the particular baseline. This is the edge closest to the floor of my office, regardless of the stack orientation.

Any 'NSStackView' and AutoLayout help, either emotional or technical, is most appreciated.

0 投票する
1 に答える
1672 参照

ios - TextKit を使用した UITextView のアニメーション化された UIImage

UIImage複数の画像フレームと、アニメーション GIF ファイルから一緒にスライスされたデュレーションを含む があります。画像を a に読み込むと、期待どおりにアニメーション化されますが、代わりにUIWebViewa を使用したいと思います。UITextView明らかな選択は、TextKit をカスタムNSLayoutMangerおよび多くのカスタムNSAttributedString属性とともに使用して、さまざまな描画効果を実現することです。インラインで表示する必要があるすべての画像の s を含む単一のUITextViewものを提供したいと思います。これらのアニメーション化された の 1 つをロードするときを除いて、正常に動作していますが、フレームを通してアニメーション化されません。これを達成する方法について何か考えはありますか?私は理論的な選択肢を思いつきました:NSAttributedStringNSTextAttachmentUIImages

  1. アニメーション画像ごとに、カスタム定義の属性を追加します
  2. レイアウト マネージャーが背景を描画するときは、この属性を繰り返して添付ファイルの位置を特定します。
  3. UIImageViewアニメーション イメージを含む を作成し、サブビューとして追加し、呼び出すためのテキスト ビューへのコールバックstartAnimating

私はまだこれを試していませんが、かなりハッキーです。より良いオプションがあるかどうか疑問に思っています。

要約すると、追加のオブジェクトを必要とせずに、ビアのUIImage内側をアニメーション化したいと考えています。これが以前に で行われたという事実は無視できます。には、現在構成しているアニメーション フレームを設定するためのプロパティ ( 、 ) があります。に割り当てるとアニメーションが表示され、 に設定するとアニメーションは表示されません。UITextViewNSTextAttachmentNSAttributedStringUIImageViewUIWebViewUIImageimagesdurationUIImageViewNSTextAttachment

フィードバックをいただければ幸いです。ありがとう!

0 投票する
1 に答える
1026 参照

objective-c - AppKit でのテキスト幅測定のパフォーマンス

AppKit で多数の NSString オブジェクト (100 万など) の幅を非常に高速に測定する方法はありますか? 私はこれを行うために3つの異なる方法を試しました:

  • [NSString sizeWithAttributes:]
  • [NSAttributedString サイズ]
  • NSLayoutManager (高さではなくテキストの幅を取得)

    いくつかのパフォーマンス メトリックを次に示します 。



    NSLayoutManager は明らかに進むべき道ですが、問題は

  • 重い NSTextStorageオブジェクト が作成されるため、メモリ フットプリントが高くなります(プロファイラによると 1GB 以上) 。
  • 高い作成時間。かかる時間はすべて、上記の文字列の作成中にあり、それ自体が大きな問題です (その後、グリフが作成され配置された NSTextStorage オブジェクトを測定するのに約 0.0002 秒しかかかりません)。
  • 私がやろうとしていることには、7秒はまだ遅すぎます。もっと速い方法はありますか?約 1 秒で 100 万本の弦を測定するには?

    遊んでみたい場合は、こちらが github プロジェクトです。

  • 0 投票する
    0 に答える
    179 参照

    objective-c - NSlayoutManager を UIView に合わせる

    NSLayoutManager (TextKit) を使用して UIView を設定し、UIView を UIScrollView に配置しました。スクロールできるように、UIView のサイズをテキストのサイズに変更するのに問題があります。

    現在、テキストは画面いっぱいに表示されていますが、scrollView は実際には画面の残りの部分までスクロールしません。

    UIView コード:

    }

    使用する

    数値を取得します(テキストの正しい高さだと思います)。

    返された数値を使用して UIView のサイズを変更するにはどうすればよいですか。

    私のViewController.mで私は使ってみました

    Ps。UIView は IBOutlet として UIViewController にアタッチされ、daveningView と呼ばれますが、UIView のカスタム クラス名は CoreDavening です。DaveningLabel は ScrollView です (私はそれを修正する予定の scrollView の悪い言葉遣いを知っています)

    編集 1: ViewController コード:

    制約なし。

    0 投票する
    3 に答える
    3802 参照

    ios - タップから UILabel の文字のインデックスを取得する

    UILabel でタップされた文字のインデックスを取得したいと思います。UILabel をサブクラス化しました。私のawakeFromNib()にはこれがあります:

    最初の文字をタップし、touchesEnded で 0 のインデックスを取得するように、ラベルの最初の 5 文字に対して希望どおりに機能しています。

    var touchedCharacterIndex = layoutManager.characterIndexForPoint(touch.locationInView(self), inTextContainer: textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

    しかし、UILabel の最初の 4 文字を超えてどこかをタップすると、4 または 0 が返されますが、これは正しくありません。

    ありがとう、

    アップデート

    コメントの提案から、私はこれを追加しました:

    、 、layoutSubviews()、、awakFromNibのセッターでこれを呼び出します。boundsframeattributedTexttext

    そして、テキストの長さが21の場合、最初の文字をタップすると6になるなど、奇妙なインデックスが表示されます.

    0 投票する
    1 に答える
    1061 参照

    ios - NSLayoutManager を使用してアニメーション テキスト効果を作成しますか?

    WWDC 2013のセッション 220 (テキスト キットによる高度なテキスト レイアウトと効果) では、高度なテキスト アニメーションと組み合わせて使用​​し、作成することNSLayoutManagerができると具体的に述べています。彼らは方法を言いません。NSTextStorageNSTextContainer

    NSLayoutManager/ NSTextStorage/NSTextContainerを使用して、カスタム テキスト アニメーションを作成したいと考えています。簡単に言うと、個々のグリフのサイズと位置をアニメーション化し、特定のグリフをフェードおよびフェード解除したいと考えています。

    を使用したアニメーション専用の方法やドキュメントはないようです。NSLayoutManager私が見つけた問題に関する唯一のチュートリアルは hereです。ただし、アニメーションを想定どおりに使用する方法ではNSLayoutManagerなく、アニメーションにハックする方法を示しています (個々のグリフごとに作成されます!)。CATextLayer

    誰かが私を正しい方向に向けることができますか? NSLayoutManager/ NSTextStorage/NSTextContainerを使用して静的テキストをレンダリングする方法を知っています。テキストをアニメーション化する原理を示すいくつかのデモはNSLayoutManager完璧でしょう。始めるためだけに、自分で詳細を把握できます。