1

白いサブビューの上部をビュー コントローラーのコンテナー ビューの高さの半分に揃えようとしています。添付画像を参照してください。Xcode の古いバージョンでは、CTRL キーを押しながらビューからコンテナー ビューにドラッグし、「コンテナー ビューとの上部配置」を選択することができましたが、新しい Xcode 6.1 では、「TopLayout ガイド」との配置のみを提供します。そのため、その制約を使用して、画像の右側にあるように制約を設定しました。私の読書に基づいて、次の式が適用されます。

プロパティ 1 = プロパティ 2 * 乗数 + 定数。

だから私は自分の設定でこれをやりたかった: View.top = TopLayoutGuide.bottom * 0.5 + 0

白い「ビュー」の上部が TopLayoutGuide.bottom の半分の高さに揃うようにします。ただし、これを行うと、.5 が完全に無視され、白いビューの上部が TopLayouGuide.bottom に揃えられ、基本的に画面全体が覆われます。

誰かが私が間違っていることを理解できますか?ビューの上部をコンテナの半分の高さに揃える適切な方法は何ですか?

ありがとう

-マレナ下の画像を参照

4

2 に答える 2

3

Xcode 6.1 でも同じ問題が発生しました。一種のベンチマークとして使用するサブビューを追加することで、ストーリーボード エディターのみを使用してビューを (ほぼ) 半分に分割する方法がいくつかあることがわかりました。iMemonのプログラムによる解決策は機能しますが、中間点を参照として使用するオブジェクトの制約にコードを追加する必要があり、面倒になる可能性があります。

問題を解決するには:

  1. コントローラーのメイン ビューに別のビューを追加します。
  2. 背景に対して目立つ色を付けます。
  3. 高さを 1 にします。
  4. それをメイン ビューの中心に移動し、「コンテナーの垂直方向の中心」制約を与えます。
  5. オブジェクトの上部または下部をドラッグして、追加したばかりのビューのフレームに合わせることができます。コントロール+クリック+任意のオブジェクトから新しいビューにドラッグし、ポップアップメニューから適切な制約を選択することで、制約を適用できます。
  6. ベンチマーク ビューの色をアプリケーションで見えないように変更します。整列させたいオブジェクトもクリアで、背景があったため、クリアカラーを使用しました。クリアがうまくいかない場合は、整列したオブジェクトの幅と一致するようにベンチマーク ビューの幅を制限してから、それらに同じ色を与えることができます。

ビューをベンチマークとして使用するというこの考え方を、2 つのオブジェクト間の距離の 3/4 の点に合わせるなど、他の状況に拡張することができます。オブジェクトをビューに追加し、それらに制約を適用してから、ビューを移動してスーパービューにも制約を適用できます。創造性を発揮して実験してください。

于 2015-02-07T01:50:18.143 に答える
0

Interface Builder でやりたいことが実現できません。しかし、これはコードを介して制約を作成することで可能になります。ここからダウンロードできるサンプル プロジェクトを作成しました。

以下は、コードを介して制約を追加する ViewController ファイルのコードです。注: メイン ビューの高さを取得する必要があるため、Interface Builder に任意の制約を追加しました。それらも重要です

//
//  ViewController.swift
//  Test
//
//  Created by FR-MAC on 11/12/14.
//  Copyright (c) 2014 ABC. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var mySubview: UIView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.addContraintsForMoviePlayerView(self.mySubview, superView: self.view)

}

func addContraintsForMoviePlayerView(var view:UIView, superView:UIView) -> Void {

    view.setTranslatesAutoresizingMaskIntoConstraints(false)
    let leftConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: superView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 0)

    let rightConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: superView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 0)

    let bottomConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: superView, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0)

    var topValue:CGFloat = superView.frame.size.height
    topValue = topValue/2

    let topConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: view.superview?, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: topValue)

    // Remove the constraints created in Interface Builder to avoid autolayout constraint issues. We just added those constraints to get the correct height of self.view.frame which we used to create above topConstaint
    self.view.removeConstraints(self.view.constraints())

    //Add the above created constraints
    superView.addConstraints( [leftConstraint, rightConstraint, topConstraint, bottomConstraint] )
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

これがお役に立てば幸いです:)

于 2014-11-12T10:55:53.457 に答える