2016-09-21 6 views
1

UITableViewにラベルを設定しています。そのラベルの文字数が120を超え、UItableViewCellを新しい大きなラベルに合わせて拡大する場合に限り、ラベルの最後に「もっと読む」ボタンを追加するにはどうすればよいですか?助けてください。私は、その後でread more部分のNSLinkAttributeNameを追加(と...)NSAttributedString 120と文字に変えて、あなたはそれがラベルに行くように手動で文字列を調整する必要がありますと思います(SWIFT)ラベルに詳細を追加して展開するUITableViewCell

+0

利用できる非常に素晴らしい高度な設定のライブラリがあります(https://github.com/OpenFibers/DragRefreshAndLoadMoreTableDemo)[これを見る] – iphonic

+0

私が何かを必要とします迅速に、私はそれを直接設定することができます。 –

答えて

1

ダミーのURLは、textView shouldInteractWithURLをオーバーライドし、そこに展開関数を入れてください(セルをフルストリングで再ロードするだけです)

+0

あなたの答えをありがとう!データをリロードする前に、ラベルの高さをどのように拡大することができるかについて、いくつかの詳細を教えてください。そのラベルに関連する制約はどうですか? –

+0

セルにラベルしかない場合は、セルの4辺をピン4に差し込み、 'UITableViewAutomaticDimension'で自動的に高さを計算させるようにすれば、ラベルの文字列を変更してtableViewの' beginUpdate'と 'endUpdate'を呼び出して高さを更新する – Tj3n

+0

いいえ、そうではありません。ラベルの下に一定の高さではない画像があります。だから、私はちょうど4面を固定することはできません。 –

0

最初にlabelに割り当てる文字列を計算します。 120文字以上の場合は、セルの右下にボタンを作成して追加します(続き)。

Read More & Expand

を押しRead Moreが、その後boundingRectWithSizeを使用して文字列のサイズを計算するとき、それは、セルのサイズを更新し、その特定のセルをリロードします。

一つのグローバルboolean配列を作成します。その特定のセルをリロードButtonRead Moreクリックイベントに

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    CGFloat height = 420; // assign initial height 
    CGRect lblFrame = CGRectMake(40, 50, 194, 50); //assign initial frame 

    NSString *strText = [someArray objectAtIndex:indexPAth.row]; 
    CGRect rect = [strText boundingRectWithSize:CGSizeMake(lblFrame.size.width, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil]; 

    if (rect.size.height > lblFrame.size.height || rect.size.height < lblFrame.size.height) { 
     float diff = rect.size.height - lblFrame.size.height; 
     height = height+diff+20; 
    } 

    if (isRowOpen[indexPath.row] == TRUE) { 

     CGRect rect = [strSharedText boundingRectWithSize:CGSizeMake(lblFrame.size.width, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil]; 

     if (rect.size.height > lblFrame.size.height || rect.size.height < lblFrame.size.height) { 
      float diff = rect.size.height - lblFrame.size.height; 
      height = height+diff+20; 
     } 
    } 
    return height; 
} 

そして最後:

bool isRowOpen[]; 

をあなたの方法は次のようにする必要があります。展開する場合は、isRowOpen[selectedRow] = TRUEを更新してください。あなたが崩壊したければ、再びisRowOpen[selectedRow] = FALSEを更新してください。それで、あなたが望むものが効果を発揮します。 @VRAwesome答えのちょうどスウィフト3バージョン

+0

詳細な回答ありがとうございます。しかし、可能ならば迅速にそれを必要とします。 –

+0

あなたはそれを 'swift'で自分で変換することができます:) – VRAwesome

+1

' strSharedText'はどこから来たのですか? –

1

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 

    var height: CGFloat = 333 

    // assign initial height 
    let lblFrame = CGRect(x: CGFloat(40), y: CGFloat(50), width: CGFloat(194), height: CGFloat(50)) 

    //assign initial frame 
    let strText = currentChallenge.description as NSString 
    let rect = strText.boundingRect(with: CGSize(width: lblFrame.size.width, height: CGFloat(Float.greatestFiniteMagnitude)), options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil) 

    if rect.size.height > lblFrame.size.height || rect.size.height < lblFrame.size.height { 
     let diff = rect.size.height - lblFrame.size.height 
     height = height + diff + 20 
    } 

    if isRowOpen[indexPath.row] == true { 

     let rect = strSharedText.boundingRect(with: CGSize(width: lblFrame.size.width, height: CGFloat(Float.greatestFiniteMagnitude)), options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil) 

     if rect.size.height > lblFrame.size.height || rect.size.height < lblFrame.size.height { 
      let diff = rect.size.height - lblFrame.size.height; 
      height = height + diff + 20; 
     } 
    } 

    return height 
} 
+0

strSharedTextはどこから来ていますか?あなたはロジックコメントが不足していて、アルゴリズムが機能していません。 –

+0

私がしたのは、別のアンサーを何も変えずに最新のswiftに変換したことだけでした。任意のコメントをオリジナルのautho @vrawesomeに参照することができます –

関連する問題