回答:
yourSubView.center = CGPointMake(yourView.frame.size.width / 2,
yourView.frame.size.height / 2);
yourSubView.center = CGPoint(x: yourView.frame.size.width / 2,
y: yourView.frame.size.height / 2)
bounds
いないためframe
、ではなくを使用する必要frame
がありtransform
ます。
size
使用されているだけなので、実際にはこの場合は違いはありません。
あなたはこれを行うことができ、それは常に動作します:
child.center = [parent convertPoint:parent.center fromView:parent.superview];
Swiftの場合:
child.center = parent.convert(parent.center, from:parent.superview)
child.center = parent.center
。「child.center = CGPointMake(parent.bounds.height / 2、parent.bounds.width / 2)」を使用します。これにより、親ビューの中心が何に設定されているかに関係なく、常にサブビューが中心になります。
UIView.bounds
、ビュー自体に相対的です(したがってbounds.origin
、最初はゼロです)。UIView.center
始める前に、原点がCGPoint
ビューの左上隅であることを思い出してください。見解と親について理解することが重要です。
次の単純なコードを見てみましょう。ビューに黒い四角を追加するビューコントローラーです。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
createDummyView()
super.view.backgroundColor = UIColor.cyanColor();
}
func createDummyView(){
var subView = UIView(frame: CGRect(x: 15, y: 50, width: 50 , height: 50));
super.view.addSubview(subView);
view.backgroundColor = UIColor.blackColor()
}
}
これにより、このビューが作成されます。黒い長方形の原点と中心は、親と同じ座標に適合します
次に、subViewに別のSubSubViewを追加し、subSubviewにsubViewと同じ原点を与えますが、subSubViewをsubViewの子ビューにします
次のコードを追加します。
var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)
そしてこれが結果です:
この行のため:
subSubView.frame.origin = subView.frame.origin;
紫色の長方形の原点は親(黒い長方形)と同じであると期待していますが、その下にありますが、それはなぜですか?別のビューにビューを追加すると、subViewフレーム「world」が親のBOUND RECTANGLEになるため、メイン画面の原点がすべてのサブビューの座標(15、15)にあるビューがある場合、左上隅は(0,0)になります
これが、親のバインドされた四角形、つまりそのsubViewの「世界」によって常に親を参照する必要がある理由です。この行を次のように修正してみましょう。
subSubView.frame.origin = subView.bounds.origin;
魔法を見ると、subSubviewはその親の起点に正確に配置されています。
それで、「親ビューだけで私のビューを中央に配置したかったのですが、大したことは何ですか?」まあ、大したことではありません。次のようにして、フレームから取得した親の中心点を親の境界中心に「変換」するだけです。
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
あなたは実際に彼に「親ビューセンターを取り、それをサブサブビューの世界に変換する」と言っています。
そして、あなたはこの結果を得るでしょう:
私は使うだろう:
self.childView.center = CGPointMake(CGRectGetMidX(self.parentView.bounds),
CGRectGetMidY(self.parentView.bounds));
CGRect
オプションを使用したい...
SWIFT 3:
self.childView.center = CGPoint(x: self.parentView.bounds.midX,
y: self.parentView.bounds.midY);
まず、子ビューの自動サイズ変更を無効にします
UIView *view1, *view2;
[childview setTranslatesAutoresizingMaskIntoConstraints:NO];
UIView + AutolayoutまたはPurelayoutの場合:
[view1 autoAlignAxis:ALAxisHorizontal toSameAxisOfView:view2];
[view1 autoAlignAxis:ALAxisVertical toSameAxisOfView:view2];
UIKitレベルのautolayoutメソッドのみを使用している場合:
[view1 addConstraints:({
@[ [NSLayoutConstraint
constraintWithItem:view1
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:view2
attribute:NSLayoutAttributeCenterX
multiplier:1.f constant:0.f],
[NSLayoutConstraint
constraintWithItem:view1
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:view2
attribute:NSLayoutAttributeCenterY
multiplier:1.f constant:0.f] ];
})];
私は好む:
UIView *parentView, *childView;
[childView setFrame:({
CGRect frame = childView.frame;
frame.origin.x = (parentView.frame.size.width - frame.size.width) / 2.0;
frame.origin.y = (parentView.frame.size.height - frame.size.height) / 2.0;
CGRectIntegral(frame);
})];
CGRectIntegral
最も簡単な方法:
child.center = parent.center
この自動サイズ変更マスクを内部ビューに設定します。
IOS9では、レイアウトアンカーAPIを使用できます。
コードは次のようになります。
childview.centerXAnchor.constraintEqualToAnchor(parentView.centerXAnchor).active = true
childview.centerYAnchor.constraintEqualToAnchor(parentView.centerYAnchor).active = true
このオーバーの利点CGPointMake
かはCGRect
、これらの方法であなたが定数にビューの中心を設定しているが、この技術であなたは永遠に保持する二つのビュー、どんなに関係に設定されていることであるparentview
変更を。
これを行う前に、必ず確認してください。
self.view.addSubview(parentView)
self.view.addSubView(chidview)
translatesAutoresizingMaskIntoConstraints
各ビューのfalse に設定します。
これにより、クラッシュやオートレイアウトによる干渉を防ぐことができます。
ビューとサブビューで同じ中心を使用するのが最も簡単な方法です。このようなことができます
UIView *innerView = ....;
innerView.view.center = self.view.center;
[self.view addSubView:innerView];
を使用したPureLayoutによる別のソリューションautoCenterInSuperview
。
// ...
UIView *innerView = [UIView newAutoLayoutView];
innerView.backgroundColor = [UIColor greenColor];
[innerView autoSetDimensionsToSize:CGSizeMake(100, 30)];
[outerview addSubview:innerView];
[innerView autoCenterInSuperview];
これは次のようになります。
c#またはXamarin.iosでは、次のように使用できます
imageView.Center = new CGPoint(tempView.Frame.Size.Width / 2、tempView.Frame.Size.Height / 2);
func callAlertView() {
UIView.animate(withDuration: 0, animations: {
let H = self.view.frame.height * 0.4
let W = self.view.frame.width * 0.9
let X = self.view.bounds.midX - (W/2)
let Y = self.view.bounds.midY - (H/2)
self.alertView.frame = CGRect(x:X, y: Y, width: W, height: H)
self.alertView.layer.borderWidth = 1
self.alertView.layer.borderColor = UIColor.red.cgColor
self.alertView.layer.cornerRadius = 16
self.alertView.layer.masksToBounds = true
self.view.addSubview(self.alertView)
})
}// calculation works adjust H and W according to your requirement