2016-04-05 6 views
0

私のUIViewのはそうのような互いの上に積み重ねています私のUIViewが互いの上に積み重なるのを妨げるどのような制約がありますか?

enter image description here

各UIViewのはwordContainerの内側にあります。その後、私はUIViewのののこのコレクションを取り、私のwordContainerに追加

var labels = [UIView]() 
    for word in words { 

     let wordLabel    = UILabel(frame: CGRectZero) 
     wordLabel.text    = word.valueForKey("sanskrit") as? String 
     wordLabel.numberOfLines  = 0 
     wordLabel.sizeToFit() 
     wordLabel.translatesAutoresizingMaskIntoConstraints = false 

     let englishWordLabel   = UILabel(frame: CGRectMake(wordLabel.frame.width + 10,0,0,0)) 
     englishWordLabel.text   = word.valueForKey("english") as? String) 
     englishWordLabel.numberOfLines = 0 
     englishWordLabel.sizeToFit() 
     englishWordLabel.lineBreakMode  = .ByWordWrapping 
     englishWordLabel.translatesAutoresizingMaskIntoConstraints = false 

     let wordView = UIView(frame: CGRectMake(0,0,self.view.frame.width,englishWordLabel.frame.height)) 
     wordView.translatesAutoresizingMaskIntoConstraints = false 
     wordView.addSubview(wordLabel) 
     wordView.addSubview(englishWordLabel) 

     wordView.sizeToFit() 

     labels.append(wordView) 
    } 

:各UIViewのは、私はそうのような2つのつの子UILabel年代に、個々のUIViewを作成することの

の内側に2 UILabel年代を持っています。これは私が想像するところでは、NSLayoutConstraintsを設定する必要があります。アイデアは、私がそれらのすべてをお互いの上に適切に積み重ねて欲しいということです。

word: definition 
word: definition 
word: definition 
word: definition 

をしかし、その代わりに、それは次のようになります:たとえば、次のようになります

let wordContainer = UIView(frame: CGRectZero) 

    var currentY:CGFloat  = 0.0 
    let margin_height:CGFloat = 4.0 
    var height:CGFloat  = 0 

    for view in wordViews { 
     var rect = view.frame 
     rect.origin.y = currentY 
     view.frame = rect 

     currentY += view.frame.height 
     height += view.frame.height 

     wordContainer.addSubview(view) 

    } 
    let containRect = CGRectMake(0,0,self.view.frame.width, height) 
    wordContainer.frame = containRect 

そして:私はそうのようwordContainerにそれらを追加

enter image description here

私はwordContainerのために自分の制約を設定しました。これは、すべての単語のためのスペースが、eacの上に積まれていなければhその他:

wordContainer.bottomAnchor.constraintEqualToAnchor(cell.contentView.bottomAnchor).active  = true 
    wordContainer.topAnchor.constraintEqualToAnchor(cell.contentView.topAnchor).active   = true 

私の最新のアイデアは、これに制約を追加する必要があります。私はcellの高さにNSLayoutConstraintsを追加することで実験してきた、と私はもはやすべての単語を行う際に、適切にレイアウトされていません。代わりに、それらはお互いの上に積み重ねられます。しかし、これは自動的にcontentView内部のコンテンツを、その高さを調整するために、セルがcontentViewのすべての4辺に対する制約を持たなければならないためには

+2

あなたは、Visual IBを参照している、自動レイアウトで – dan

+0

@danを使用せずに自動レイアウト 'UITableViewAutomaticDimension'を使用することはできませんか? – Trip

+0

autolayoutとは、ビューに制約を加えることを意味します。実際には、設定フレームでビューを手動でスタックしようとするのではなく、 'UIStackView'を使うだけです。 – dan

答えて

2

...右方向のように思えます。

私は自分自身は、テキスト、画像、埋め込まれたツイートのための異なる種類の細胞でこれを行って、あなたが説明してきた問題のいくつかを持っていました。最も簡単な方法は、コンテンツビュー内の任意のコンポーネントの周りにビューを追加し、その要素にすべての制約を簡単に追加できることでした。

私はこれを示すことができるもののために周りに簡単に見ていたし、いくつかのスクリーンショットとそれを説明する別のSO answerを見つけました。

はまた、今日これを行うときに私が使用する基準はviewDidLoad()に、してみてください、あなたのUITableViewControllerThis post on Ray Wenderlich's site

+0

書いてくれてありがとう。私は昨日その特定のSOのポストにいくつかの時間を費やしました。それを私のコードにコピーし、 'wordContainer'の制約を親の' cell'に引き継いで、 'cell.frame.size.height'が実際に変更されていることが分かりますが、' 44.0 'と呼ばれ、サブビューは互いの上にスペーシングとスタックを失います。 – Trip

+0

あなたの設定はうまく見えますが、これはあなたの制約です。コンテンツに基づいて計算される高さを設定する必要はありませんが、トップラベルとコンテンツビューの上端の間の距離を設定する必要があります。 2番目のラベルの上部と上部ラベルの下部、2番目のラベルの下部とコンテンツビューの下部。 (そして両側) – Scriptable

+0

ああ、面白いよ。 「距離」とは、制約や高さ/幅を設定することですか? – Trip

0

た:ストーリーボードで

//set up table view cell dynamic height 
tableView.rowHeight = UITableViewAutomaticDimension 

を、必ず自動レイアウトを使用して作成し、制約のすべてのことスーパービューへのあなたのセルの要素の設定と修正が行われます。たとえば、セルの一番上のテキストにスーパービューのマージンを定義し、値に設定する必要があります。

+0

これは私の答えで書かれています。 – Trip

関連する問題