2017-01-28 15 views
1

カスタムのキーボードを使用して入力する4つのラベルがあるアプリを作成しています。最後の行の直後のテキストフィールドに通常の行を模倣する必要があります。like here私のtextLabelsは角の半径を持っているので、私は境界や影を使って問題を解決することはできません。キャリッジラインを模倣する最良の方法は何ですか?

私は同じビューを作成したが、0角の半径を、私は私が必要な場所で行を取得するために管理してきましたが、その位置は固定されている理由です
@IBOutlet weak var xField: InsetLabel! 
@IBOutlet weak var yField: InsetLabel! 
@IBOutlet weak var wField: InsetLabel! 
@IBOutlet weak var hField: InsetLabel! 
var textfields: [InsetLabel] = [] 

@IBOutlet weak var xSuppView: UIView! 
@IBOutlet weak var ySuppView: UIView! 
@IBOutlet weak var hSuppView: UIView! 
@IBOutlet weak var wSuppView: UIView! 
var suppViews: [UIView] = [] 

override func viewDidLoad(){ 
    super.viewDidLoad() 
    textfields = [xField, yField, wField, hField] 
    suppViews = [xSuppView, ySuppView, wSuppView, hSuppView] 

for (index, view) in textfields.enumerated() { 

     let carriageView = UIView() 
     let width: CGFloat = 2.0 
     let x = view.frame.maxX + width 
     let y = view.frame.minY 
     let height = view.frame.height 
     carriageView.frame = CGRect(x: x, y: y, width: 2, height: height) 
     carriageView.layer.masksToBounds = true 
     carriageView.layer.cornerRadius = 2 
     carriageView.backgroundColor = ColorConstants.carriageColor 
     carriages.append(carriageView) 
     suppViews[index].addSubview(carriageView) 
     suppViews[index].translatesAutoresizingMaskIntoConstraints = false 

     let trailingConstraint = NSLayoutConstraint(item: carriageView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 0) 
     let heightConstraint = NSLayoutConstraint(item: carriageView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: height) 
     let topSpaceConstraint = NSLayoutConstraint(item: carriageView, attribute: .centerY, relatedBy: .equal, toItem: suppViews[index], attribute: .centerY, multiplier: 1, constant: 0) 
carriageView.addConstraints([trailingConstraint, heightConstraint, topSpaceConstraint]) 


     view.sizeToFit() 

     view.layer.masksToBounds = true 
     view.layer.cornerRadius = 4 
    } 
} 

let carriageView = UIView() 
     let width: CGFloat = 2.0 
     let x = view.frame.maxX + width 
     let y = view.frame.minY 
     let height = view.frame.height 
     carriageView.frame = CGRect(x: x, y: y, width: 2, height: height) 
     carriageView.layer.masksToBounds = true 
     carriageView.layer.cornerRadius = 2 
     carriageView.backgroundColor = ColorConstants.carriageColor 
     carriages.append(carriageView) 
     suppViews[index].addSubview(carriageView) 
} 

だから、それは私のtextLabelの幅で移動するために私がプログラムによってこの行に制約を追加しましたが、コンパイラがそれを好きではありません。この制約はストーリーボードの制約と矛盾しているようです。基本的には、1つのスーパービューの2つのサブビューを共通の側で制約する必要があります。私は間違って何をしていますか?これはエラーの一部です

When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] to debug. 

btwは、私がストーリーボードにあるほとんどすべてのビューをインスタンス化するための悪いプログラミングスタイルですか?プログラムですべてを作成する方法を学習する必要がありますか?

EDIT

エラーは、私がビューに制約を追加ラインに表示されます。

carriageView.addConstraints([trailingConstraint, heightConstraint, topSpaceConstraint]) 

は、それは私がのviewDidLoadで作成したストーリーボードで作成したサブビューと、サブビューを、持っている、と私はコードでそれらを制約しようとしていますので、OKですか? This is how the tree of the superview looks

EDIT

私はこのビューを作成することは、プログラム悪い考えだったこと、考え出したので、私はちょうど主要なスペースにただ1制約を追加するよりも、インターフェースビルダーで各ラベルにビューを追加しました。プログラマチックなアプローチよりもはるかに簡単です

+1

いくつかのアラームが最初にこの質問で鳴っていました。私は間違っていた。上院議員。あなたの最後の質問としては、正当な理由がある限り、コード内でのみ動作すること(特に自動レイアウトを使用する場合)はありません。私はiPadのものが肖像画か風景かを知る必要がありました。私は風景を左または右にしたいので、最初はコードを試しました。それは(コードで)働いたが、その後、私はアプリケーションの拡張機能(写真の編集)を追加し、私のコードはヒットしていませんでした。 **それは正当な理由です。**私にとってこれは良い理由のようにも聞こえます。 – dfd

+0

あなたの質問を賞賛しましたので、もうひとつ注意してください。表示されているエラーは、ビュー階層内の同じノードにない2つのビュー間で制約があることを示唆しています。これはいくつかのことが原因である可能性があります。ビュー階層を設定したコードを表示できますか(IBまたはaddSubviewにありますか)?また、可能であれば、エラーを返すコードの正確な行を指摘できますか? – dfd

+0

私はあなたの質問を理解していません。すべてのUITextFieldにカーソルがあります。あなたはあなたのラインとあなたのラインなしで現在の外観をどのようにスクリーンショットを作ることができますか? – muescha

答えて

0

問題は、自動レイアウトを使用しているときと、自動サイズ調整(手動フレームと自動サイズ変更マスク)を使用しているときを理解することです。

デフォルトでは、translatesAutoresizingMaskIntoConstraintstrueです。また、autolayoutを使用して、storyboard /したがって

、あなたが手動でフレームを使用するかどうかを選択する必要があります

suppViews[index].translatesAutoresizingMaskIntoConstraints = false 

を設定する必要はありません。

carriageView.frame = CGRect(x: x, y: y, width: 2, height: height) 

や制約

let trailingConstraint = NSLayoutConstraint(item: carriageView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 0) 
let heightConstraint = NSLayoutConstraint(item: carriageView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: height) 
let topSpaceConstraint = NSLayoutConstraint(item: carriageView, attribute: .centerY, relatedBy: .equal, toItem: suppViews[index], attribute: .centerY, multiplier: 1, constant: 0) 
carriageView.addConstraints([trailingConstraint, heightConstraint, topSpaceConstraint]) 

あなたの代わりに自動レイアウトを使用することを選択した場合、あなたは

carriageView.translatesAutoresizingMaskIntoConstraints = false 

になります

carriageView.autoresizingMask = [.flexibleHeight, .flexibleLeftMargin] 

と:O、その後、carriageViewのための任意の制約を設定しないと、おそらくあなたはマスクを自動サイズ設定する必要があり、マニュアルのフレームを設定しますあなたはスーパーにいくつかの制約を追加する必要があります:

carriageView.addConstraints([heightConstraint]) 
suppViews[index].addConstraints([trailingConstraint, topSpaceConstraint]) 

またはユーティリティ機能使用:

NSLayoutConstraint.activate([trailingConstraint, heightConstraint, topSpaceConstraint]) 

IBで制約を作成する方がはるかに簡単ですが、コード内で何が起こっているのかを理解する必要があります。

関連する問題