2016-07-15 6 views
1

UIScrollViewを作成し、それを水平方向にスクロールします。UIViewを含むUIScrollViewをスクロールしたときに、UIViewがデフォルトに戻されるのはなぜですか?

UIScrollViewの内部には、UIViewにはテキストを表示するUILabelとビューを非表示にするUIButtonがあります。

ラベルのテキストがユーザーによって変更されると、ビューの幅が変更されますが、ボタンのサイズは変更されません。

私がUIViewに実行させたいのは、UIScrollViewが左右にスクロールされたときにそのサイズを保持することです。しかし、UIViewはスクロールすると元のサイズに戻ります。

以下の画像は、ストーリーボードの設定を示しています。 2つの矩形はUIViewであり、それぞれのUILabelにはデフォルトで「ラベル」のテキストがあります。文字Xはボタンです。これらの2つを含む水平領域はUIScrollViewです。

enter image description here

次は私がシミュレータでアプリを実行するシーンです。私はこれらのUIViewの境界線をプログラムによって変更しました。これらのテキストは、私が作ったメニューから選択され、UILabelsの幅が変わるとUIViewの幅が変更されます。両方のラベルが同じテキストを持つ理由を無視してください。私は第2の視点を扱っていませんでした。大文字小文字の区別は1つのUIViewであっても同じです。

enter image description here

私は右にUIScrollViewのをスクロールすると、問題が発生します。これらのUIViewの幅は、ストーリーボードに設定されたデフォルトに戻ります。メニューが選択されたときに、以下の

enter image description here

Theh関数が呼び出されます。これらの奇妙な変数名には申し訳ありません

//selectedTextPrim, selectedTextSecn: String() 
//result1Text, result2Text: UILabel 
//result1, result2: UIView 
//result1XBtn, result2XBtn: UIButton 
func processAddResult(){ 
    result1Text.text = selectedTextPrim + " > " + selectedTextSecn 
    result1Text.sizeToFit() 
    result1.frame.size.width = result1Text.frame.size.width + 24 
    result1XBtn.frame.origin.x = result1Text.frame.maxX 

    result2.frame.origin.x = result1.frame.maxX + 8 

    result2Text.text = selectedTextPrim + " > " + selectedTextSecn 
    result2Text.sizeToFit() 
    result2.frame.size.width = result2Text.frame.size.width + 24 
    result2XBtn.frame.origin.x = result2Text.frame.maxX 
//  print("\(result1Text.frame.size.height)") 
} 

コードを変更する必要がありますか?または、どこかにコードを追加してこれを管理する方法はありますか?

答えて

2

ビューは、自動レイアウトの制約によって配置されます。フレームを(実行中に)直接設定することはできますが、次にシステムがレイア​​ウトパスを実行するとき、自動レイアウトは制約に従ってフレームをリセットします。

多くのものがレイアウトパスをトリガーできます。そのうちの1人がビューのboundsを変更しています。スクロール表示のスクロール方法は、独自のbounds.originを変更することです。スクロールビューがスクロールするたびに、レイアウトパスがトリガされます。これらのレイアウト・パスの間に、ビューのframeに直接行った変更は、自動レイアウト制約によって指示されたフレームにリセットされます。

この場合、各ラベルがテキストに合わせて自動的にサイズを変更するように見えます。自動レイアウトでこれを自動的に行うことができます。ラベルのサイズに他の制約を設定しないと、自動レイアウトではラベルのintrinsicContentSizeが使用されます。このラベルは、ラベルのテキストを設定するたびに自動的に設定されます。

次に、各背景矩形が自動的にラベルを囲むようにします。これを行うには、矩形の辺をラベルの辺に拘束します(さらに、詰め物を提供する定数に加えて)。自動レイアウトでは、矩形のフレームが自動的にラベルのフレームに沿って表示されます。

すべて正しく入力した場合は、のみ変更する必要があります。ラベルのテキストです。自動レイアウトは、ラベルと背景の四角形のサイズ変更と再配置を行います。

“Taking Control of Auto Layout in Xcode 5” from WWDC 2013をご覧ください。

関連する問題