เพิ่มมุมมองใน UIStackView โปรแกรม


158

ฉันกำลังพยายามเพิ่มมุมมองใน UIStackView แบบเป็นโปรแกรม ตอนนี้รหัสของฉันคือ:

UIView *view1 = [[UIView alloc]init];
view1.backgroundColor = [UIColor blackColor];
[view1 setFrame:CGRectMake(0, 0, 100, 100)];

UIView *view2 =  [[UIView alloc]init];
view2.backgroundColor = [UIColor greenColor];
[view2 setFrame:CGRectMake(0, 100, 100, 100)];

[self.stack1 addArrangedSubview:view1];
[self.stack1 addArrangedSubview:view2];

เมื่อฉันปรับใช้แอพมีเพียง 1 วิวเท่านั้นและมีสีดำ (วิว 1 รับพารามิเตอร์สำหรับวิว 2 ด้วย)


คุณมีสติตรวจสอบร้านของคุณ? คุณบันทึกการแสดงข้อมูลย่อยที่รันไทม์หรือไม่
Wain

10
ใช้addArrangedSubview:ไม่ใช่addSubview:
pkamb

คำตอบ:


245

มุมมองสแต็กใช้ขนาดเนื้อหาที่แท้จริงดังนั้นใช้ข้อ จำกัด โครงร่างเพื่อกำหนดขนาดของมุมมอง

มีวิธีง่ายๆในการเพิ่มข้อ จำกัด อย่างรวดเร็ว (ตัวอย่าง):

[view1.heightAnchor constraintEqualToConstant:100].active = true;

รหัสเสร็จสมบูรณ์:

- (void) setup {

    //View 1
    UIView *view1 = [[UIView alloc] init];
    view1.backgroundColor = [UIColor blueColor];
    [view1.heightAnchor constraintEqualToConstant:100].active = true;
    [view1.widthAnchor constraintEqualToConstant:120].active = true;


    //View 2
    UIView *view2 = [[UIView alloc] init];
    view2.backgroundColor = [UIColor greenColor];
    [view2.heightAnchor constraintEqualToConstant:100].active = true;
    [view2.widthAnchor constraintEqualToConstant:70].active = true;

    //View 3
    UIView *view3 = [[UIView alloc] init];
    view3.backgroundColor = [UIColor magentaColor];
    [view3.heightAnchor constraintEqualToConstant:100].active = true;
    [view3.widthAnchor constraintEqualToConstant:180].active = true;

    //Stack View
    UIStackView *stackView = [[UIStackView alloc] init];

    stackView.axis = UILayoutConstraintAxisVertical;
    stackView.distribution = UIStackViewDistributionEqualSpacing;
    stackView.alignment = UIStackViewAlignmentCenter;
    stackView.spacing = 30;


    [stackView addArrangedSubview:view1];
    [stackView addArrangedSubview:view2];
    [stackView addArrangedSubview:view3];

    stackView.translatesAutoresizingMaskIntoConstraints = false;
    [self.view addSubview:stackView];


    //Layout for Stack View
    [stackView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = true;
    [stackView.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = true;
}

หมายเหตุ:สิ่งนี้ได้รับการทดสอบบน iOS 9

UIStackView เท่ากับระยะห่าง (กึ่งกลาง)


26
จุดของการใช้มุมมองสแต็กคือพวกเขาซ่อนรายละเอียดของการจัดการข้อ จำกัด จากนักพัฒนา ในขณะที่คุณชี้ให้เห็นว่าสิ่งนี้ขึ้นอยู่กับการชมย่อยที่มีขนาดเนื้อหาที่แท้จริงซึ่งเป็นค่าเริ่มต้นที่UIViewsไม่มี หากผู้โพสต์ดั้งเดิมได้ใช้UILabelอินสแตนซ์แทนUIViewรหัสของเขาจะทำงานตามที่คาดไว้ ฉันเพิ่มตัวอย่างที่แสดงด้านล่างนี้
Greg Brown

เมื่อฉันทำสิ่งนี้ "[view1.heightAnchor constraintEqualToConstant: 100] .active = true;" im ได้รับข้อผิดพลาดใน iOS 8 มันทำงานเฉพาะกับ iOS 9.I รู้ว่า uistackview สำหรับ iOS 9+ แต่ฉันจะตั้งค่า heightAncor ข้อ จำกัด สำหรับ iOS 8 ได้อย่างไร
nuridin selimko

เพิ่ม StackView ของฉันโดยใช้กระดานเรื่องราว ที่รันไทม์ฉันกำลังเพิ่ม UIViews หลายรายการ (มีตัวอย่างย่อยอื่น ๆ ) ลงใน stackView หลังจากโหลดข้อมูลมุมมองทั้งหมดภายใน stackView มีความสูงเท่ากันมุมมองเหล่านั้นจะไม่ได้รับการปรับขนาดตามเนื้อหา @ user1046037
Mansuu ....

คุณมีข้อ จำกัด ที่กำหนดไว้สำหรับมุมมองส่วนบุคคลเหล่านั้นเพื่อให้ขนาดของพวกเขาจะแตกต่างกันไปตามเนื้อหาหรือไม่
user1046037

นี่เป็นวิธีที่ดีที่สุดและเหมาะสมที่สุดในการจัดการมุมมองที่มีความกว้างหรือความสูงเท่ากัน
กัมปี

156

สวิฟท์ 5.0

//Image View
let imageView = UIImageView()
imageView.backgroundColor = UIColor.blue
imageView.heightAnchor.constraint(equalToConstant: 120.0).isActive = true
imageView.widthAnchor.constraint(equalToConstant: 120.0).isActive = true
imageView.image = UIImage(named: "buttonFollowCheckGreen")

//Text Label
let textLabel = UILabel()
textLabel.backgroundColor = UIColor.yellow
textLabel.widthAnchor.constraint(equalToConstant: self.view.frame.width).isActive = true
textLabel.heightAnchor.constraint(equalToConstant: 20.0).isActive = true
textLabel.text  = "Hi World"
textLabel.textAlignment = .center

//Stack View
let stackView   = UIStackView()
stackView.axis  = NSLayoutConstraint.Axis.vertical
stackView.distribution  = UIStackView.Distribution.equalSpacing
stackView.alignment = UIStackView.Alignment.center
stackView.spacing   = 16.0

stackView.addArrangedSubview(imageView)
stackView.addArrangedSubview(textLabel)
stackView.translatesAutoresizingMaskIntoConstraints = false

self.view.addSubview(stackView)

//Constraints
stackView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
stackView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true

ตามคำตอบ @ user1046037


2
เริ่มต้นiOS 8มันเป็นไปได้ที่จะเปิดใช้งานข้อ จำกัด ในการใช้ชุดactivate(_:)และก็มักจะมีประสิทธิภาพมากขึ้นที่จะทำมันด้วยวิธีนี้developer.apple.com/documentation/uikit/nslayoutconstraint/...
โจนาธาน Cabrera

เวอร์ชั่น Swift 5: stackoverflow.com/a/58827722/2273338
Abdurrahman Mubeen Ali

17

UIStackViewใช้ข้อ จำกัด ภายในเพื่อวางตำแหน่งการดูย่อยที่จัดเรียงไว้ ข้อ จำกัด ใดที่สร้างขึ้นขึ้นอยู่กับวิธีกำหนดค่ามุมมองสแต็กเอง ตามค่าเริ่มต้นมุมมองสแต็กจะสร้างข้อ จำกัด ที่จัดวางการชมย่อยที่จัดเรียงไว้ในแนวนอนการตรึงมุมมองนำหน้าและต่อท้ายไปที่ขอบนำหน้าและต่อท้ายของตัวเอง ดังนั้นรหัสของคุณจะสร้างเลย์เอาต์ที่มีลักษณะดังนี้:

|[view1][view2]|

พื้นที่ที่จัดสรรให้แต่ละมุมมองย่อยนั้นพิจารณาจากปัจจัยหลายประการรวมถึงขนาดเนื้อหาที่แท้จริงของ subview และความต้านทานการบีบอัดและลำดับความสำคัญของการแฮ็กเนื้อหา ตามค่าเริ่มต้นUIViewอินสแตนซ์จะไม่กำหนดขนาดเนื้อหาที่แท้จริง นี่คือสิ่งที่เป็นผู้ให้บริการชั้นย่อยทั่วไปเช่นหรือUILabelUIButton

เนื่องจากความต้านทานการบีบอัดเนื้อหาและลำดับความสำคัญของการแฮ็กเนื้อหาของสองUIViewอินสแตนซ์ใหม่จะเหมือนกันและไม่มีมุมมองที่ให้ขนาดเนื้อหาที่แท้จริงเครื่องมือโครงร่างต้องคาดเดาได้ดีที่สุดว่าขนาดใดควรจัดสรรให้กับแต่ละมุมมอง ในกรณีของคุณจะกำหนดมุมมองแรก 100% ของพื้นที่ว่างและไม่มีมุมมองที่สอง

หากคุณแก้ไขโค้ดเพื่อใช้งานUILabelอินสแตนซ์แทนคุณจะได้ผลลัพธ์ที่ดีกว่า:

UILabel *label1 = [UILabel new];
label1.text = @"Label 1";
label1.backgroundColor = [UIColor blueColor];

UILabel *label2 = [UILabel new];
label2.text = @"Label 2";
label2.backgroundColor = [UIColor greenColor];

[self.stack1 addArrangedSubview:label1];
[self.stack1 addArrangedSubview:label2];

โปรดทราบว่าไม่จำเป็นต้องสร้างข้อ จำกัด ใด ๆ ด้วยตนเอง นี่คือประโยชน์หลักของการใช้UIStackView- ซ่อนรายละเอียดการจัดการข้อ จำกัด จากนักพัฒนาซอฟต์แวร์ (มักจะน่าเกลียด)


ฉันมีปัญหาแบบเดียวกันกับที่ใช้กับป้ายกำกับ แต่ไม่ใช่สำหรับ TextFields (หรือมุมมองสำหรับเรื่องนั้น) นอกจากนี้ทุกบทเรียนฉันพบว่าใช้ป้ายกำกับรูปภาพหรือปุ่ม นี่หมายความว่าสิ่งใดที่แตกต่างจากองค์ประกอบ UI เหล่านี้เราไม่สามารถใช้วิธีนี้ได้หรือไม่
ทางกายภาพ

@physicalattraction มุมมองที่คุณเพิ่มไปยังมุมมองสแต็กจะต้องมีขนาดเนื้อหาที่แท้จริง ในขณะที่ฉันจำได้ว่าขนาดที่แท้จริงของฟิลด์ข้อความจะขึ้นอยู่กับเนื้อหาของฟิลด์ (ซึ่งเป็นเลขคี่) อินสแตนซ์ของUIViewตัวเองไม่มีขนาดที่แท้จริง คุณอาจจำเป็นต้องใช้ข้อ จำกัด เพิ่มเติมกับมุมมองเหล่านี้เพื่อที่มุมมองสแต็กจะรู้ว่าตัวเองมีขนาดใหญ่เพียงใด
เกร็กบราวน์

ทำให้รู้สึกดังนั้นฉันพยายาม ตอนนี้ฉันได้สร้างมุมมองในรูปแบบ xib ที่มีฟิลด์ข้อความซึ่งฉันมีข้อจำกัดความสูงอย่างชัดเจนที่ 30 พิกเซล ฉันยิ่งทำให้สองต่อไปนี้ข้อ จำกัด : และMyTextField.top = top+20 bottom = MyTextField.bottom+20ฉันคาดหวังว่าสิ่งนี้จะทำให้มุมมองของฉันมีความสูงภายใน 70 แต่แทนที่จะบ่นเกี่ยวกับข้อ จำกัด ที่ขัดแย้งกัน คุณรู้หรือไม่ว่าเกิดอะไรขึ้นที่นี่ เป็นมุมมองนี้ที่ฉันต้องการวางไว้ใน UIStackView ของฉัน
ทางกายภาพ

ฉันคิดว่าฉันรู้ว่าปัญหาคืออะไร มุมมองแบบสแต็กจะตรึงมุมมองย่อยที่จัดเรียงสุดท้ายไว้ที่ขอบด้านล่างโดยอัตโนมัติ มุมมองแบบสแต็กกำลังพยายามทำให้คอนเทนเนอร์ของคุณดูขนาดเดียวกันกับตัวเอง อย่างไรก็ตามคุณได้บอกมุมมองนี้ว่าต้องมีความสูง 70 พิกเซลซึ่งสร้างความขัดแย้ง ลองสร้างมุมมองที่ว่างเปล่าเพิ่มเติมทันทีหลังจากมุมมองคอนเทนเนอร์ของคุณและให้ลำดับความสำคัญของเนื้อหาแนวตั้งเป็น 0 ให้มุมมองคอนเทนเนอร์ของคุณในแนวตั้งลำดับความสำคัญของการแฮ็กเนื้อหา 1000 ซึ่งจะทำให้มุมมองว่างเปล่า ดู.
เกร็กบราวน์

ฉันสมมติว่าคุณกำลังใช้มุมมองกองซ้อนในแนวตั้ง นอกจากนี้คุณยังอาจต้องการตรวจสอบบทความนี้ผมเขียนเกี่ยวกับมุมมองสแต็ค: dzone.com/articles/...
เกร็กบราวน์

13

ใน Swift 4.2

let redView = UIView()
    redView.backgroundColor = .red

    let blueView = UIView()
    blueView.backgroundColor = .blue

    let stackView = UIStackView(arrangedSubviews: [redView, blueView])
    stackView.axis = .vertical
    stackView.distribution = .fillEqually

    view.addSubview(stackView)

    //        stackView.frame = CGRect(x: 0, y: 0, width: 200, height: 200)

    // autolayout constraint
    stackView.translatesAutoresizingMaskIntoConstraints = false

NSLayoutConstraint.activate([stackView.topAnchor.constraint(equalTo: view.topAnchor), stackView.leftAnchor.constraint(equalTo: view.leftAnchor), stackView.rightAnchor.constraint(equalTo: view.rightAnchor), stackView.heightAnchor.constraint(equalToConstant: 200)])

8

คุณต้องตั้งค่าประเภทการกระจาย ในรหัสของคุณเพียงเพิ่ม:

self.stack1.distribution = UIStackViewDistributionFillEqually;

หรือคุณสามารถตั้งค่าการกระจายโดยตรงในเครื่องมือสร้างส่วนต่อประสานของคุณ ตัวอย่างเช่น:

ป้อนคำอธิบายรูปภาพที่นี่

หวังว่าจะช่วย;) Lapinou


8

การติดตามสองบรรทัดแก้ไขปัญหาของฉัน

    view.heightAnchor.constraintEqualToConstant(50).active = true;
    view.widthAnchor.constraintEqualToConstant(350).active = true;

รุ่น Swift -

    var DynamicView=UIView(frame: CGRectMake(100, 200, 100, 100))
    DynamicView.backgroundColor=UIColor.greenColor()
    DynamicView.layer.cornerRadius=25
    DynamicView.layer.borderWidth=2
    self.view.addSubview(DynamicView)
    DynamicView.heightAnchor.constraintEqualToConstant(50).active = true;
    DynamicView.widthAnchor.constraintEqualToConstant(350).active = true;

    var DynamicView2=UIView(frame: CGRectMake(100, 310, 100, 100))
    DynamicView2.backgroundColor=UIColor.greenColor()
    DynamicView2.layer.cornerRadius=25
    DynamicView2.layer.borderWidth=2
    self.view.addSubview(DynamicView2)
    DynamicView2.heightAnchor.constraintEqualToConstant(50).active = true;
    DynamicView2.widthAnchor.constraintEqualToConstant(350).active = true;

    var DynamicView3:UIView=UIView(frame: CGRectMake(10, 420, 355, 100))
    DynamicView3.backgroundColor=UIColor.greenColor()
    DynamicView3.layer.cornerRadius=25
    DynamicView3.layer.borderWidth=2
    self.view.addSubview(DynamicView3)

    let yourLabel:UILabel = UILabel(frame: CGRectMake(110, 10, 200, 20))
    yourLabel.textColor = UIColor.whiteColor()
    //yourLabel.backgroundColor = UIColor.blackColor()
    yourLabel.text = "mylabel text"
    DynamicView3.addSubview(yourLabel)
    DynamicView3.heightAnchor.constraintEqualToConstant(50).active = true;
    DynamicView3.widthAnchor.constraintEqualToConstant(350).active = true;

    let stackView   = UIStackView()
    stackView.axis  = UILayoutConstraintAxis.Vertical
    stackView.distribution  = UIStackViewDistribution.EqualSpacing
    stackView.alignment = UIStackViewAlignment.Center
    stackView.spacing   = 30

    stackView.addArrangedSubview(DynamicView)
    stackView.addArrangedSubview(DynamicView2)
    stackView.addArrangedSubview(DynamicView3)

    stackView.translatesAutoresizingMaskIntoConstraints = false;

    self.view.addSubview(stackView)

    //Constraints
    stackView.centerXAnchor.constraintEqualToAnchor(self.view.centerXAnchor).active = true
    stackView.centerYAnchor.constraintEqualToAnchor(self.view.centerYAnchor).active = true

8

สำหรับคำตอบที่ยอมรับเมื่อคุณพยายามที่จะซ่อนมุมมองใด ๆ ภายในมุมมองสแต็คข้อ จำกัด การทำงานไม่ถูกต้อง

Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x618000086e50 UIView:0x7fc11c4051c0.height == 120   (active)>",
    "<NSLayoutConstraint:0x610000084fb0 'UISV-hiding' UIView:0x7fc11c4051c0.height == 0   (active)>"
)

เหตุผลคือเมื่อซ่อนviewในstackViewมันจะตั้งความสูงเป็น 0 เพื่อเคลื่อนไหว

โซลูชันเปลี่ยนข้อ จำกัดpriorityดังต่อไปนี้

import UIKit

class ViewController: UIViewController {

    let stackView = UIStackView()
    let a = UIView()
    let b = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()

        a.backgroundColor = UIColor.red
        a.widthAnchor.constraint(equalToConstant: 200).isActive = true
        let aHeight = a.heightAnchor.constraint(equalToConstant: 120)
        aHeight.isActive = true
        aHeight.priority = 999

        let bHeight = b.heightAnchor.constraint(equalToConstant: 120)
        bHeight.isActive = true
        bHeight.priority = 999
        b.backgroundColor = UIColor.green
        b.widthAnchor.constraint(equalToConstant: 200).isActive = true

        view.addSubview(stackView)
        stackView.backgroundColor = UIColor.blue
        stackView.addArrangedSubview(a)
        stackView.addArrangedSubview(b)
        stackView.axis = .vertical
        stackView.distribution = .equalSpacing
        stackView.translatesAutoresizingMaskIntoConstraints = false
    }

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

    // Just add a button in xib file or storyboard and add connect this action.
    @IBAction func test(_ sender: Any) {
        a.isHidden = !a.isHidden
    }

}

5
    //Image View
    let imageView               = UIImageView()
    imageView.backgroundColor   = UIColor.blueColor()
    imageView.heightAnchor.constraintEqualToConstant(120.0).active = true
    imageView.widthAnchor.constraintEqualToConstant(120.0).active = true
    imageView.image = UIImage(named: "buttonFollowCheckGreen")

    //Text Label
    let textLabel               = UILabel()
    textLabel.backgroundColor   = UIColor.greenColor()
    textLabel.widthAnchor.constraintEqualToConstant(self.view.frame.width).active = true
    textLabel.heightAnchor.constraintEqualToConstant(20.0).active = true
    textLabel.text  = "Hi World"
    textLabel.textAlignment = .Center


    //Third View
    let thirdView               = UIImageView()
    thirdView.backgroundColor   = UIColor.magentaColor()
    thirdView.heightAnchor.constraintEqualToConstant(120.0).active = true
    thirdView.widthAnchor.constraintEqualToConstant(120.0).active = true
    thirdView.image = UIImage(named: "buttonFollowMagenta")


    //Stack View
    let stackView   = UIStackView()
    stackView.axis  = UILayoutConstraintAxis.Vertical
    stackView.distribution  = UIStackViewDistribution.EqualSpacing
    stackView.alignment = UIStackViewAlignment.Center
    stackView.spacing   = 16.0

    stackView.addArrangedSubview(imageView)
    stackView.addArrangedSubview(textLabel)
    stackView.addArrangedSubview(thirdView)
    stackView.translatesAutoresizingMaskIntoConstraints = false;

    self.view.addSubview(stackView)

    //Constraints
    stackView.centerXAnchor.constraintEqualToAnchor(self.view.centerXAnchor).active = true
    stackView.centerYAnchor.constraintEqualToAnchor(self.view.centerYAnchor).active = true

ปรับปรุงคำตอบโดย @Oleg Popov


4

ในกรณีของฉันสิ่งที่ยุ่งกับฉันคาดหวังคือฉันขาดสายนี้:

stackView.translatesAutoresizingMaskIntoConstraints = false;

หลังจากนั้นไม่จำเป็นต้องตั้งข้อ จำกัด ให้กับการสัมภาษณ์ย่อยที่ฉันจัดเตรียมไว้ใด ๆ Stackview กำลังดูแลเรื่องนั้น


4

คำตอบของOleg Popovเวอร์ชั่นSwift 5ซึ่งขึ้นอยู่กับคำตอบของ user1046037

//Image View
let imageView = UIImageView()
imageView.backgroundColor = UIColor.blue
imageView.heightAnchor.constraint(equalToConstant: 120.0).isActive = true
imageView.widthAnchor.constraint(equalToConstant: 120.0).isActive = true
imageView.image = UIImage(named: "buttonFollowCheckGreen")

//Text Label
let textLabel = UILabel()
textLabel.backgroundColor = UIColor.yellow
textLabel.widthAnchor.constraint(equalToConstant: self.view.frame.width).isActive = true
textLabel.heightAnchor.constraint(equalToConstant: 20.0).isActive = true
textLabel.text  = "Hi World"
textLabel.textAlignment = .center

//Stack View
let stackView   = UIStackView()
stackView.axis  = NSLayoutConstraint.Axis.vertical
stackView.distribution  = UIStackView.Distribution.equalSpacing
stackView.alignment = UIStackView.Alignment.center
stackView.spacing   = 16.0

stackView.addArrangedSubview(imageView)
stackView.addArrangedSubview(textLabel)
stackView.translatesAutoresizingMaskIntoConstraints = false

self.view.addSubview(stackView)

//Constraints
stackView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
stackView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true

1

ฉันเพิ่งเจอปัญหาที่คล้ายกันมาก เช่นเดียวกับที่กล่าวไว้ก่อนขนาดของมุมมองสแต็กขึ้นอยู่กับขนาดเนื้อหาที่แท้จริงของการดูย่อยที่จัดเรียง นี่คือโซลูชันของฉันใน Swift 2.x และโครงสร้างมุมมองต่อไปนี้:

มุมมอง - UIView

customView - CustomView: UIView

stackView - UISTackView

การจัดวางหมวดย่อย - คลาสย่อย UIView ที่กำหนดเอง

    //: [Previous](@previous)

import Foundation
import UIKit
import XCPlayground

/**Container for stack view*/
class CustomView:UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }


    init(){
        super.init(frame: CGRectZero)

    }

}

/**Custom Subclass*/
class CustomDrawing:UIView{
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()

    }

    func setup(){
       // self.backgroundColor = UIColor.clearColor()
        print("setup \(frame)")
    }

    override func drawRect(rect: CGRect) {
        let ctx = UIGraphicsGetCurrentContext()
        CGContextMoveToPoint(ctx, 0, 0)
        CGContextAddLineToPoint(ctx, CGRectGetWidth(bounds), CGRectGetHeight(bounds))
        CGContextStrokePath(ctx)

        print("DrawRect")

    }
}



//: [Next](@next)
let stackView = UIStackView()
stackView.distribution = .FillProportionally
stackView.alignment = .Center
stackView.axis = .Horizontal
stackView.spacing = 10


//container view
let view = UIView(frame: CGRectMake(0,0,320,640))
view.backgroundColor = UIColor.darkGrayColor()
//now custom view

let customView = CustomView()

view.addSubview(customView)

customView.translatesAutoresizingMaskIntoConstraints = false
customView.widthAnchor.constraintEqualToConstant(220).active = true
customView.heightAnchor.constraintEqualToConstant(60).active = true
customView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
customView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true
customView.backgroundColor = UIColor.lightGrayColor()

//add a stack view
customView.addSubview(stackView)
stackView.centerXAnchor.constraintEqualToAnchor(customView.centerXAnchor).active = true
stackView.centerYAnchor.constraintEqualToAnchor(customView.centerYAnchor).active = true
stackView.translatesAutoresizingMaskIntoConstraints = false


let c1 = CustomDrawing()
c1.translatesAutoresizingMaskIntoConstraints = false
c1.backgroundColor = UIColor.redColor()
c1.widthAnchor.constraintEqualToConstant(30).active = true
c1.heightAnchor.constraintEqualToConstant(30).active = true

let c2 = CustomDrawing()
c2.translatesAutoresizingMaskIntoConstraints = false
c2.backgroundColor = UIColor.blueColor()
c2.widthAnchor.constraintEqualToConstant(30).active = true
c2.heightAnchor.constraintEqualToConstant(30).active = true


stackView.addArrangedSubview(c1)
stackView.addArrangedSubview(c2)


XCPlaygroundPage.currentPage.liveView = view

-2

ลองรหัสด้านล่าง

UIView *view1 = [[UIView alloc]init];
view1.backgroundColor = [UIColor blackColor];
[view1 setFrame:CGRectMake(0, 0, 50, 50)];

UIView *view2 =  [[UIView alloc]init];
view2.backgroundColor = [UIColor greenColor];
[view2 setFrame:CGRectMake(0, 100, 100, 100)];

NSArray *subView = [NSArray arrayWithObjects:view1,view2, nil];

[self.stack1 initWithArrangedSubviews:subView];

หวังว่ามันจะใช้งานได้ โปรดแจ้งให้เราทราบหากคุณต้องการคำชี้แจงเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.