2015-12-10 4 views
23

私はもともとthis questionと尋ねました。私は、私のカスタムビューの読み込み時間が遅い理由は、複数のビューを重ね合わせて表示するか、おそらくいくつかの理由で複数のビューをレイヤー化しているためだと考えていた。recursion problem。しかし、何が変わるかを調べるためにコードがさらに増えた後、UITextViewが存在するかどうかが分かりました。私の問題の明らかな原因は最初の質問で予想していたものと大きく異なるので、古い質問に長い更新を加えるのではなく、新しい質問を始めることにしました。SwiftのUITextViewプロパティを使用したカスタムUIViewの読み込み時間が遅い

2つのビューコントローラでテストプロジェクトをセットアップしました。第1のビューコントローラ上のボタンは、第2のビューコントローラへのショーセグを呼び出す。 2番目のビューコントローラに私のカスタムビューがあります。 (第2のビューコントローラを使用すると、私はそれがカスタムビューをロードするためにかかった時間の感覚を取得してみましょう。)

カスタムビューコード:あなたが見ることができるように

import UIKit 

@IBDesignable class UIMongolTextView: UIView { 

    var textView = UITextView() // key line 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override init(frame: CGRect){ 
     super.init(frame: frame) 
    } 
} 

UIViewからの唯一の違いはあります私はUITextViewプロパティを追加しました。そして、このカスタムビューは非常にゆっくりと読み込まれます。私は以下の結果(997のカウント)を取得楽器に割り当てツールを実行している:非常に迅速に、私はコメントアウトした場合のラインが

//var textView = UITextView() 

、しかし

enter image description here

をして私のカスタムビューロードそしてここでしか起こっている何7.

enter image description here

の数を持っていますか?カスタムビューでUITextViewプロパティを使用して、この遅い読み込み時間を避けることはできますか?

+0

私は同じ問題を抱えていますが、私はUIPageViewControllerを使用しています。テキストビューではinitに時間がかかりますので、次のページにスワイプしようとすると遅延があります。 – Jacob

+0

自己への注意(後で試してみる): 'UIView'として宣言し、後で' UITextView'にキャストするとどうなりますか? – Suragch

答えて

2

ラベルとテキストフィールドがサブビューとしてuiviewサブクラスに追加されたようなものを試してみました。私がやったやり方は以下の通りです:

@interface CustomTextField : UIView 

@property (weak, nonatomic) IBOutlet UITextField *valueField; 

@end 

私たちは実際にラベルとテキストフィールドを追加したxibファイルを持っていました。 xibファイルでは、ファイル所有者は "CustomTextField"で、アウトレットはそこからのヘッダーファイルにリンクされています。

コンストラクタメソッドは次のようになります。私のために

- (id)initWithValue:(NSString *)value 
{ 
    self = [super initWithFrame:CGRectZero]; 
    if (self) { 
     NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]; 
     UIView *view = nibs[0]; 
     self.valueField.frame = view.bounds; 
     [self setFrame:view.bounds]; 
     [self addSubview:view]; 
     [self.valueField setText:value]; 
    } 

    return self; 
} 

作品罰金。

+0

'UITextView'をxibに置き、xibをロードすると([この回答](http://stackoverflow.com/a/34524346/3681880))、' selectable'のチェックを外すと私の長い遅延がなくなりました私の質問(しかし、私の[元のビュー](http://stackoverflow.com/questions/34134593/slow-load-time-for-custom-uiview-in-swift)を正しく回転させるには、xibはまだhasn '働いた')。とにかく、これはここで私の質問に対する一つの解決策です。 – Suragch

1

あなたのコードをgithubからダウンロードしましたが、UIViewの代わりにUITextViewのサブクラスを書くのはなぜですか?

// 
// UIMongolTextView-A.swift 
// Mongol App Componants 
// 
// Created by Allen Zhang on 12/13/15. 
// Copyright © 2015 MongolSuragch. All rights reserved. 
// 

import UIKit 

class UIMongolTextView_A: UITextView { 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     self.setup() 
    } 

    func setup() { 
     // 1-10: ᠨᠢᠭᠡ ᠬᠤᠶᠠᠷ ᠭᠤᠷᠪᠠ ᠳᠦᠷᠪᠡ ᠲᠠᠪᠤ ᠵᠢᠷᠭᠤᠭ᠎ᠠ ᠳᠤᠯᠤᠭ᠎ᠠ ᠨᠠᠢ᠌ᠮᠠ ᠶᠢᠰᠦ ᠠᠷᠪᠠ 

     self.transform = translateRotateFlip() 


    } 

    /* 
    // Only override drawRect: if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func drawRect(rect: CGRect) { 
     // Drawing code 
    } 
    */ 
    func translateRotateFlip() -> CGAffineTransform { 

     var transform = CGAffineTransformIdentity 

     // translate to new center 
     transform = CGAffineTransformTranslate(transform, (self.bounds.width/2)-(self.bounds.height/2), (self.bounds.height/2)-(self.bounds.width/2)) 
     // rotate counterclockwise around center 
     transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2)) 
     // flip vertically 
     transform = CGAffineTransformScale(transform, -1, 1) 

     return transform 
    } 
} 
+0

これは私がやろうとしたことです(これはAndroidのためのものなので)。問題は、 'UITextView'を回転させると、テキストレイアウトと自動レイアウトが混乱することです。詳細については、[この質問](http://stackoverflow.com/questions/30907710/rotating-a-view-in-layoutsubviews)を参照してください。私は、あなたがプロジェクトをダウンロードする努力をしてくれてありがとう。 – Suragch

21

ボトルネックは、UITextViewのselectableプロパティです。 selectableがデフォルト値のtrueに設定されたUITextViewの作成には、不可解なパフォーマンス問題があります。

問題を回避する最も簡単な方法は、ストーリーボードを使用してテキストビューを追加し、selectableプロパティを解除することです。コードで選択できないテキストビューを作成する方法は文書化されていないように見えます(作成後に選択可能をfalseに設定しても、作成中のパフォーマンスの問題は回避されません)。選択可能なテキストビューが必要な場合は、最初に選択不可能なテキストビューを作成し、viewDidAppearでselectableをtrueに設定します。

ストーリーボードを使用できない場合は、TTTAttributedLabelなどのサードパーティクラスの使用を検討することをおすすめします。

Appleがこの問題を回避するためにプライベートAPIを使用しているようです。他の進歩的な開発者はdiscoveredを持っており、ChatKitでは、initReadonlyAndUnselectableWithFrame:textContainer:というプライベートメソッドを使用してテキストビューが作成されているように見えます。

+2

これは私が望んでいた答えではありませんが、なぜこれが起こっているのか(ある程度までは)答えています。 – Suragch

+0

独自の 'view'プロパティに付属しているカスタムビューコントローラと、ストーリーボードのUITextViewに接続されたカスタム' textView'プロパティを追加することができます。ビューをフルスクリーンにしたくない場合は、ストーリーボードの「コンテナビュー」オブジェクトを使用して、カスタムビューコントローラを特定の領域に限定します。その後、必要な変換を 'viewDidLayoutSubviews'(デフォルトの外観)と' viewWillTransitionToSize:withTransitionCoordinator'(向きの変更)のビューに適用します。 – jamesk

+0

偉大な答え。これはUITextFieldの 'enabled'プロパティにも当てはまります。 –

1

私はUITextViewで非常によく似たパフォーマンスの問題を抱えていましたが、根本的な原因と解決策は私とは異なると思います。

私はストーリーボード上に静的テキストを持つUITextViewを持っていました。編集可能でも選択可能でもありませんでした。遅いiPod Touchでは、ViewControllerはロードに5秒かかります。

静的テキストに絵文字があります。絵文字を削除すると、問題は解決しました。私は、何が起こっていたのかを掘り起こすために楽器を使いました。それは、約25レベルの深さで、それはたくさんの...フォント...方法になっていました。私は属性のないシステムフォントを使用していたので、頭に浮かんだ最初のアイデアはテキストの絵文字でした。

関連する問題