ฉันมีUIView
ด้านในUIView
และฉันต้องการให้ด้านในUIView
อยู่กึ่งกลางด้านในเสมอโดยไม่ต้องปรับขนาดความกว้างและความสูง
ฉันได้ตั้งเสาและสปริงเพื่อให้อยู่ด้านบน / ซ้าย / ขวา / ล่างโดยไม่ต้องปรับขนาด แต่มันก็ยังไม่ได้อยู่ตรงกลาง ความคิดใด ๆ
ฉันมีUIView
ด้านในUIView
และฉันต้องการให้ด้านในUIView
อยู่กึ่งกลางด้านในเสมอโดยไม่ต้องปรับขนาดความกว้างและความสูง
ฉันได้ตั้งเสาและสปริงเพื่อให้อยู่ด้านบน / ซ้าย / ขวา / ล่างโดยไม่ต้องปรับขนาด แต่มันก็ยังไม่ได้อยู่ตรงกลาง ความคิดใด ๆ
คำตอบ:
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
มีการใช้งานเพียงอย่างเดียว
frame
คุณสมบัติทั้งหมดจะไม่ถูกกำหนดถ้ามุมมองมีการtransform
แปลงข้อมูลที่ไม่ใช่ตัวตน อ่านเอกสารเกี่ยวกับกรอบทรัพย์สินของ UIView
คุณสามารถทำได้และมันจะทำงานเสมอ:
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) ' สิ่งนี้จะทำให้ subview ของคุณอยู่กึ่งกลางไม่ว่าคุณจะตั้งค่าศูนย์มุมมองหลักไว้ที่ใด
UIView.bounds
จะสัมพันธ์กับมุมมองของตัวเอง (และดังนั้นจึงbounds.origin
เป็นครั้งแรกที่ศูนย์) ในขณะที่UIView.center
ระบุไว้ในระบบพิกัดของSuperView
ก่อนที่เราจะเริ่มเราจะมาเตือนจุดเริ่มต้นว่าเป็นมุมซ้ายบน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;
คุณคาดหวังให้ที่มาของสี่เหลี่ยมสีม่วงเหมือนกันกับมันเป็นแม่ (สี่เหลี่ยมสีดำ) แต่มันอยู่ใต้มันและทำไมมันถึงเป็นอย่างนั้น? เนื่องจากเมื่อคุณเพิ่มมุมมองไปยังมุมมองอื่นเฟรมมุมมอง "โลก" ตอนนี้เป็นเฟรมย่อยของแม่ถ้าคุณมีมุมมองที่ว่าต้นกำเนิดบนหน้าจอหลักอยู่ที่ coords (15,15) สำหรับมุมมองย่อยทั้งหมด มุมบนซ้ายจะเป็น (0,0)
นี่คือเหตุผลที่คุณต้องอ้างถึงผู้ปกครองเสมอโดยสี่เหลี่ยมผืนผ้าที่ถูกผูกไว้ซึ่งเป็น "โลก" ของการดูย่อยช่วยให้แก้ไขบรรทัดนี้ไปที่:
subSubView.frame.origin = subView.bounds.origin;
และดูเวทย์มนตร์ subSubview ตอนนี้ตั้งอยู่ในแหล่งกำเนิดของมัน:
ดังนั้นคุณชอบ "ตกลงฉันแค่ต้องการให้มุมมองของฉันอยู่ตรงกลางโดยมุมมองพ่อแม่ของฉันเรื่องใหญ่คืออะไร" ดีมันไม่ใช่เรื่องใหญ่คุณเพียงแค่ต้อง "แปล" จุดศูนย์กลางของผู้ปกครองซึ่งนำมาจากกรอบไปสู่กึ่งกลางขอบเขตของผู้ปกครองโดยทำสิ่งนี้:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
คุณกำลังบอกเขาว่า "พาผู้ปกครองไปที่จุดศูนย์กลางและเปลี่ยนเป็น subSubView world"
และคุณจะได้รับผลลัพธ์นี้:
ฉันจะใช้:
self.childView.center = CGPointMake(CGRectGetMidX(self.parentView.bounds),
CGRectGetMidY(self.parentView.bounds));
ฉันชอบที่จะใช้CGRect
ตัวเลือก ...
สวิฟท์ 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 เท่านั้น:
[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
ตั้งค่าหน้ากากปรับขนาดอัตโนมัตินี้เป็นมุมมองภายในของคุณ
ด้วย IOS9 คุณสามารถใช้ layout anchor 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
สำหรับแต่ละมุมมองเป็นเท็จ
การทำเช่นนี้จะช่วยป้องกันการหยุดทำงานและเลย์เอาต์อัตโนมัติจากการแทรกแซง
คุณสามารถใช้ได้
yourView.center = CGPointMake(CGRectGetMidX(superview.bounds), CGRectGetMidY(superview.bounds))
และใน Swift 3.0
yourView.center = CGPoint(x: superview.bounds.midX, y: superview.bounds.midY)
การใช้ศูนย์เดียวกันในมุมมองและมุมมองย่อยเป็นวิธีที่ง่ายที่สุดในการดำเนินการ คุณสามารถทำอะไรเช่นนี้
UIView *innerView = ....;
innerView.view.center = self.view.center;
[self.view addSubView:innerView];
ทางออกก็มีPureLayoutautoCenterInSuperview
ใช้
// ...
UIView *innerView = [UIView newAutoLayoutView];
innerView.backgroundColor = [UIColor greenColor];
[innerView autoSetDimensionsToSize:CGSizeMake(100, 30)];
[outerview addSubview:innerView];
[innerView autoCenterInSuperview];
นี่คือลักษณะที่ปรากฏ:
ใน c # หรือ Xamarin.ios เราสามารถใช้สิ่งนี้
imageView.Center = CGPoint ใหม่ (tempView.Frame.Size.Width / 2, tempView.Frame.Size.Height / 2);
ฉันจะใช้:
child.center = CGPointMake(parent.bounds.height / 2, parent.bounds.width / 2)
ง่ายสั้นและหวาน หากคุณใช้คำตอบของ @ Hejazi ด้านบนและparent.center
ตั้งไว้ที่สิ่งอื่นที่ไม่ใช่มุมมองย่อย(0,0)
ของคุณจะไม่ถูกรวมไว้ที่ศูนย์!
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