2016-05-02 9 views
0

私はios 9 sdkを使用しています。私は両方向に80%でスケーリング二のCustomView(Bそれを呼び出す)最初の後ろを(Aそれを呼び出す)、作成しようと、上記のよUIViewトランスフォーム、オートレイアウト、アンカーポイント

----- Top 
    | 30 
----- CustomView (A) 
    | 
    | 
----- 
    | 0 
----- Bot 

:私はautoloayoutと、このビュー階層のセットアップを作成しました5ポイント。 Bの上部だけが見えます。

これは簡単なはずですが、そうではありません。 autolayoutがBの位置にアンカーポイント(デフォルトでは中央に設定されている)を使用しているように見えるので、Bの-5ポイントの平行移動と.8のスケーリングを適用するとBが上に移動するのではなく下に移動します。 Bを下降させ、それを上下に動かします。

アンカーポイントを(x = 0.5、y = 1)に変更すると、AとBがそのサイズの半分まで移動しますが、理由はわかりません。それで問題は解決しません。

編集:いくつかのコード

var card = new CardView(); 
InsertSubview(card, 0); 

card.TranslatesAutoresizingMaskIntoConstraints = false; 
this.AddConstraints(
      card.AtTopOf(this, 30), 
      card.WithSameWidth(this).WithMultiplier(.95f), 
      card.WithSameCenterX(this), 
      card.AtBottomOf(this) 
      ); 

var transform = CGAffineTransform.MakeTranslation(0, -10); 
transform.Scale(.8f,.8f); 
Transform = transform; 

結果:カードは30ptの元の位置の横に、それはおよそ50ptsであり、上から20ptsではありません。私が見

+0

正しくあなたの質問を得ていない

遊び場に次のコードは、あなたが望む結果が得られます!あなたは正確に何をしたいですか? – Lion

+1

ビューの作成と追加に使用しているコードを含めてください。適切な診断を受けている可能性があります。アンカーポイントは中央ですので、スケーリングは「間違った」方向に縮小しますが、すでに行っていることを見ることなく修正を提案するのは難しいです。 – jrturton

+0

コードはXamarinをC#で使用しているため、誰もが読むことができません。 – Softlion

答えて

1

不適切な制約を追加しています。いくつかの実験の後、私はあなたが望む結果を得ました。キーは、バックグラウンドビューの中心Yを前景ビューの先頭に固定するように見えます。これは、アンカーポイントを変更するときに与えられた垂直シフトをオフセットします。

import UIKit 
import XCPlayground 

let view = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 400, height:400))) 
view.backgroundColor = UIColor.whiteColor() 
XCPlaygroundPage.currentPage.liveView = view 

let a = UIView() 
a.translatesAutoresizingMaskIntoConstraints = false 
a.backgroundColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 0.5) 
view.addSubview(a) 
a.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 30).active = true 
a.widthAnchor.constraintEqualToAnchor(view.widthAnchor).active = true 
a.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor).active = true 

let b = UIView() 
b.translatesAutoresizingMaskIntoConstraints = false 
b.backgroundColor = UIColor(red: 0, green: 1, blue: 0, alpha: 1) 
b.layer.anchorPoint = CGPoint(x: 0.5, y: 0) 
view.addSubview(b) 
view.sendSubviewToBack(b) 
NSLayoutConstraint.activateConstraints([ 
    b.centerYAnchor.constraintEqualToAnchor(a.topAnchor), 
    b.widthAnchor.constraintEqualToAnchor(a.widthAnchor), 
    b.heightAnchor.constraintEqualToAnchor(a.heightAnchor), 
    b.centerXAnchor.constraintEqualToAnchor(a.centerXAnchor) 
]) 
let translate = CGAffineTransformMakeTranslation(0.0, -10) 
let scale = CGAffineTransformMakeScale(0.8, 0.8) 
b.transform = CGAffineTransformConcat(translate, scale) 

結果::

enter image description here

+0

なぜ動作するのかわかりませんが、動作します。実際の説明は?本当にありがとう...私はこれで2日失った、必死で、自動二輪車を取り外す準備ができました。 – Softlion

+0

私が言ったように、アンカーポイントと自動レイアウトの間の相互作用 - それはいつも少しひどいです(http://stackoverflow.com/questions/12943107/how-do-i-adjust-the-anchor-point-of-a参照)。 -calayer-when-auto-layout-is-being-use)ですが、あなたの場合、アンカーポイントを中心から上に移動します。これにより、フレームの高さの50%がオフセットされます。 2つのトップの代わりにトップが一緒にそれを逆転させる。 – jrturton

+0

あなたが参照している質問では、更新されたブログ記事では、ios8以降、autoloayoutではアンカーとトランスフォームが使用されていないと書かれています。それは真実ではないようだ。あるいは、私はブログ記事を控えめにしていません。 – Softlion

0

2の可能なアプローチは、以下のとおりです。
- その後、ビュー階層
または
に追加し、第1のスケール - あなたはビュー階層に追加する前に、ビューBのanchorpointを変更します。その後、あなたはそれをあなたが望むように変形することができます。

+0

このスケールはアニメーションで変更されるため、最初にスケールすることはできません。私はあなたに2番目の提案を試して、それは動作しません:A(とBも)の垂直中央は、画面の上部に移動されます。 autoloayoutでWTF? – Softlion

+0

各ビューにはスケーリングポイントがあります。ビューBのみを変えることはそのトリックを行うべきです。ビューAがビューBのサブビューでない限り、その場合、Aはその一部からBと共に移動します。また、Autolayoutを介して密接な関係がある場合。プロパティを見る必要があります。いくつかの落とし穴があります。 –

+0

ビューAとBは同じクラスの2つのインスタンスです。私がビューBのみをハンギングすると、ビューBの中心はメインスクリーンの一番上に移動します。 – Softlion

関連する問題