2

私はUITableViewController内の2つの要素の間に制約を追加しようとしていますが、今までできませんでした。 UIImageはUITableViewController内部ではなく、UITableViewセルの外側にあります。UIImageViewとUITableViewCellの間にNSLayoutConstraintを追加します。

StoryBoardを使用することも、制約をプログラムで追加することもできません.Xcodeは、再利用されるオブジェクトに制約を追加できないことを通知するためです。

私が制約を追加しようとしている理由は、UIImageViewがダウンロードされるイメージのサイズによって動的にサイズ変更されるためです。何らかの理由でイメージをダウンロードできない場合は、デフォルトイメージが使用され、レイアウト全体が分割されます。

は、ここに私のtableViewは次のようになります。

enter image description here

+0

を返すことができるあなたはUITableViewCellのにあなたのUIImageViewを追加する考えがありますし、 tableViewの最初のセルとして配置し、サーバーからイメージを取得するたびにセルの高さを変更しますか? –

+0

@noir_eagle、いいえ、私はありませんでしたが、それは良い考えです。私はそれを撃つだろう。ありがとうございました。 – Sicypher

+0

@noir_eagleあなたはあなたのコメントを回答として投稿するべきです。私はそれが私のために最高に働くので、それを最良の答えとして受け入れます。 – Sicypher

答えて

1

あなたのUIImageViewUITableViewCellにラップし、UITableViewの最初のセルとしてそれを置くことを検討することに変更。さらに、テーブルビューのセルの階層を2つのセクションに分割することで、セルの追跡が容易になります。したがって、最初のセクションにはUIImageViewセルのみが含まれ、2番目のセクションにはメインセルが含まれます。

あなたは画像をフェッチすることを示しているネットワークの要求から応答を得るでしょうたび、あなたはtableView.reloadSections(IndexSet(integer: 0), with: .none)を呼び出すと、デリゲートメソッドで正しい高

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) { 
    if indexPath.section == 0 { 
    return imageHeight 
    } 
} 
1

問題は制約が2つのオブジェクト間の関係を設定することです。あなたのtableViewCellは再利用されるので、セルの外側にあるオブジェクトを制約に設定することはできません。

実際には、セル上の画像のサイズを取得し、cellImageViewのサイズに応じてプログラムで外にImageViewを設定することができます。

たとえば、ダウンロードされたイメージの幅がimageCellWidthで、outsize imageViewが2倍大きくなければなりません。

NSLayoutConstraint *imageViewWidth = [NSLayoutConstraint 
            constraintWithItem:imageView 
            attribute:NSLayoutAttributeWidth 
            relatedBy:NSLayoutRelationEqual 
            toItem:nil 
            attribute:NSLayoutAttributeNonAnAttribure 
            multiplier:1.0f 
          constant:imageCellWidth*2]; 
[imageView addConstraint: imageViewWidth]; 

あなたが動的にこの制約を変更する必要がある場合は、単に一定の値

imageViewWidth.constant = newWidth; 
関連する問題