Thêm lượt xem trong UIStackView theo chương trình


158

Tôi đang cố gắng thêm lượt xem trong UIStackView theo chương trình. Hiện tại Mã của tôi là:

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];

Khi tôi triển khai ứng dụng, chỉ có 1 lượt xem và nó có màu đen. (View1 cũng nhận được các tham số cho view2)


Bạn đã kiểm tra cửa hàng của bạn? Bạn đã đăng nhập các cuộc phỏng vấn tại thời gian chạy?
Wain

10
Sử dụng addArrangedSubview:, khôngaddSubview:
pkamb

Câu trả lời:


245

Chế độ xem ngăn xếp sử dụng kích thước nội dung nội tại, do đó, sử dụng các ràng buộc bố cục để xác định kích thước của chế độ xem.

Có một cách dễ dàng để nhanh chóng thêm các ràng buộc (ví dụ):

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

Mã hoàn chỉnh:

- (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;
}

Lưu ý: Điều này đã được thử nghiệm trên iOS 9

Khoảng cách bằng nhau của UIStackView (ở giữa)


26
Điểm của việc sử dụng các khung nhìn ngăn xếp là chúng ẩn các chi tiết về quản lý ràng buộc từ nhà phát triển. Như bạn đã chỉ ra, điều này phụ thuộc vào các cuộc phỏng vấn có kích thước nội dung nội tại, mặc định là UIViewskhông. Nếu người đăng ban đầu đã sử dụng các UILabeltrường hợp thay vì UIView, mã của anh ta sẽ hoạt động như anh ta mong đợi. Tôi đã thêm một ví dụ minh họa điều này dưới đây.
Greg Brown

khi tôi làm điều này "[view1.heightAnchor ràng buộcEqualToConstant: 100] .active = true;" Tôi gặp lỗi trên ios 8. Nó chỉ hoạt động trên ios 9. Tôi biết rằng uistackview dành cho ios 9+ nhưng làm cách nào tôi có thể đặt giới hạn chiều cao cho ios 8
Nuridin selimko

StackView của tôi được thêm bằng cách sử dụng bảng phân cảnh. Trong thời gian chạy, tôi đang thêm một số UIView (chứa các bản xem trước khác) vào stackView. Sau khi tải dữ liệu, tất cả các khung nhìn bên trong stackView đều có cùng chiều cao, chúng không được thay đổi kích thước theo nội dung. @ user1046037
Mansuu ....

Bạn có các ràng buộc được đặt cho các chế độ xem riêng lẻ đó để kích thước của chúng thay đổi dựa trên nội dung không?
dùng1046037

Đây là cách tốt nhất và tối ưu để quản lý các chế độ xem có chiều rộng hoặc chiều cao bằng nhau
Kampai

156

Swift 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

Dựa trên câu trả lời @ user1046037.


2
Bắt đầu iOS 8 , có thể kích hoạt các ràng buộc theo đợt bằng cách sử dụng activate(_:)và thường hiệu quả hơn khi thực hiện theo cách này developer.apple.com/documentation/uikit/nslayoutconstraint/
trộm


17

UIStackViewsử dụng các ràng buộc trong nội bộ để định vị các cuộc phỏng vấn được sắp xếp của nó. Chính xác những ràng buộc nào được tạo ra phụ thuộc vào cách cấu hình khung nhìn ngăn xếp. Theo mặc định, chế độ xem ngăn xếp sẽ tạo ra các ràng buộc bố trí các khung nhìn được sắp xếp của nó theo một đường nằm ngang, ghim các chế độ xem hàng đầu và theo dõi vào các cạnh hàng đầu và cuối của chính nó. Vì vậy, mã của bạn sẽ tạo ra một bố cục trông như thế này:

|[view1][view2]|

Không gian được phân bổ cho mỗi khung nhìn phụ được xác định bởi một số yếu tố bao gồm kích thước nội dung bên trong của khung nhìn phụ và đó là mức độ chống nén và ưu tiên ôm nội dung. Theo mặc định, các UIViewtrường hợp không xác định kích thước nội dung bên trong. Đây là một cái gì đó thường được cung cấp bởi một lớp con, chẳng hạn như UILabelhoặc UIButton.

Do khả năng chống nén nội dung và ưu tiên ôm nội dung của hai UIViewtrường hợp mới sẽ giống nhau và không chế độ xem nào cung cấp kích thước nội dung nội tại, nên công cụ bố trí phải đưa ra dự đoán tốt nhất về kích thước nên được phân bổ cho mỗi chế độ xem. Trong trường hợp của bạn, nó chỉ định chế độ xem đầu tiên 100% không gian có sẵn và không có gì cho chế độ xem thứ hai.

Nếu bạn sửa đổi mã của mình để sử dụng các UILabelthể hiện thay thế, bạn sẽ nhận được kết quả tốt hơn:

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];

Lưu ý rằng không cần thiết phải tự tạo ra bất kỳ ràng buộc nào. Đây là lợi ích chính của việc sử dụng UIStackView- nó che giấu các chi tiết (thường xấu xí) của quản lý ràng buộc từ nhà phát triển.


Tôi có cùng một vấn đề là cái này hoạt động cho Nhãn, nhưng không phải cho TextFields (hoặc Lượt xem, cho vấn đề đó). Ngoài ra tất cả các hướng dẫn tôi tìm thấy sử dụng Nhãn, Hình ảnh hoặc Nút. Điều này có nghĩa là đối với bất kỳ điều gì khác với các thành phần UI này, chúng ta không thể sử dụng phương thức này?
vật lý

@physicalWOR Các chế độ xem bạn thêm vào chế độ xem ngăn xếp phải có kích thước nội dung nội tại. Như tôi nhớ, kích thước nội tại của một trường văn bản dựa trên nội dung của trường (là số lẻ). Trường hợp của UIViewbản thân không có một kích thước bên trong. Bạn có thể cần phải áp dụng các ràng buộc bổ sung cho các chế độ xem này để chế độ xem ngăn xếp biết mức độ lớn để tạo ra chúng.
Greg Brown

Làm cho ý nghĩa, vì vậy tôi đang thử nó. Bây giờ tôi đã xây dựng Chế độ xem trong xib với trường văn bản, tôi đưa ra giới hạn chiều cao rõ ràng là 30 pixel. Tôi cũng đưa ra hai ràng buộc sau: MyTextField.top = top+20bottom = MyTextField.bottom+20. Tôi hy vọng điều này sẽ mang lại cho quan điểm của tôi một chiều cao nội tại là 70, nhưng thay vào đó nó phàn nàn về những hạn chế xung đột. Bạn có biết những gì đang xảy ra ở đây? Đây là Chế độ xem mà tôi muốn đặt trong UIStackView của mình.
vật lý

Tôi nghĩ rằng tôi biết vấn đề là gì. Một khung nhìn ngăn xếp tự động ghim khung nhìn phụ được sắp xếp cuối cùng của nó vào cạnh dưới cùng của nó. Vì vậy, khung nhìn ngăn xếp đang cố gắng làm cho khung nhìn container của bạn có cùng kích thước với chính nó. Tuy nhiên, bạn đã nói với quan điểm này rằng nó phải cao 70 pixel, tạo ra xung đột. Hãy thử tạo chế độ xem trống bổ sung ngay sau chế độ xem vùng chứa của bạn và ưu tiên mức độ ôm sát của nội dung dọc là 0. Cung cấp cho chế độ xem vùng chứa của bạn mức độ ưu tiên ôm sát là 1000. Điều đó sẽ khiến chế độ xem trống trải dài để lấp đầy khoảng trống trong ngăn xếp lượt xem.
Greg Brown

Tôi đang giả sử rằng bạn đang sử dụng chế độ xem ngăn xếp dọc. Bạn cũng có thể muốn xem bài viết này tôi đã viết về lượt xem stack: dzone.com/articles/ Kẻ
Greg Brown

13

Trong 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

Bạn phải đặt loại phân phối cho bạn. Trong mã của bạn, juste thêm:

self.stack1.distribution = UIStackViewDistributionFillEqually;

Hoặc bạn có thể đặt phân phối trực tiếp trong trình tạo giao diện của mình. Ví dụ:

nhập mô tả hình ảnh ở đây

Hy vọng rằng sẽ giúp;) Lapinou.


8

Sau hai dòng đã khắc phục sự cố của tôi

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

Phiên bản 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

Đối với câu trả lời được chấp nhận khi bạn cố gắng ẩn bất kỳ chế độ xem nào trong chế độ xem ngăn xếp, ràng buộc hoạt động không chính xác.

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)>"
)

Lý do là khi ẩn viewtrong stackViewnó sẽ đặt chiều cao thành 0 để làm động nó.

Giải pháp thay đổi các ràng buộc prioritynhư dưới đây.

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

Cải thiện câu trả lời của @Oleg Popov


4

Trong trường hợp của tôi, điều gây rối với tôi sẽ là tôi đã bỏ lỡ dòng này:

stackView.translatesAutoresizingMaskIntoConstraints = false;

Sau đó, không cần thiết phải đặt các ràng buộc cho các cuộc phỏng vấn được sắp xếp của tôi, stackview đang chăm sóc điều đó.


4

Phiên bản Swift 5 của câu trả lời của Oleg Popov , dựa trên câu trả lời của người dùng1046037

//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

Tôi chỉ gặp vấn đề rất giống nhau. Giống như được đề cập trước các kích thước của chế độ xem ngăn xếp phụ thuộc vào một kích thước nội dung nội tại của các cuộc phỏng vấn được sắp xếp. Đây là giải pháp của tôi trong Swift 2.x và cấu trúc khung nhìn sau:

xem - UIView

customView - CustomView: UIView

stackView - UISTackView

sắp xếp các cuộc phỏng vấn - các lớp con UIView tùy chỉnh

    //: [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

Hãy thử mã dưới đây,

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];

Hy vọng nó hoạt động. Xin vui lòng cho tôi biết nếu bạn cần làm rõ thêm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.