Làm cách nào để buộc UITextView cuộn lên đầu mỗi khi tôi thay đổi văn bản?


99

OK, tôi đang gặp một số vấn đề với UITextView. Đây là vấn đề:

Tôi thêm một số văn bản vào a UITextView. Sau đó, người dùng nhấp đúp để chọn một cái gì đó. Sau đó, tôi thay đổi văn bản trong UITextView(theo chương trình như trên) và các UITextView cuộn xuống cuối trang nơi có con trỏ.

Tuy nhiên, đó KHÔNG phải là nơi người dùng nhấp vào. Nó LUÔN cuộn xuống cuối UITextViewbất kể người dùng đã nhấp vào đâu.

Vì vậy, đây là câu hỏi của tôi: Làm cách nào để buộc nút UITextViewcuộn lên đầu mỗi khi tôi thay đổi văn bản? Tôi đã thử contentOffsetscrollRangeToVisible. Không có tác dụng.

Mọi lơi đê nghị đêu nên được đanh gia cao.

Câu trả lời:


148
UITextView*note;
[note setContentOffset:CGPointZero animated:YES];

Điều này làm điều đó cho tôi.

Phiên bản Swift (Swift 4.1 với iOS 11 trên Xcode 9.3):

note.setContentOffset(.zero, animated: true)

13
Đừng giúp tôi.
Dmitry

6
Điều này hoạt động, nhưng tại sao điều này lại cần thiết? Logic cuộn của Apple cần được tinh chỉnh, có quá nhiều vòng nhảy để khiến mọi thứ hoạt động theo cách mà chúng tự động nên làm trong hầu hết các trường hợp.
John Contarino

4
Hoạt động với tôi trong iOS 9 nhưng không sớm hơn viewDidAppear().
Murray Sagal

4
Bạn có thể gọi nó sớm hơn viewDidAppear () bằng cách gọi nó trong viewDidLayoutSubviews ()
arcady bob

Tôi đã thêm xem văn bản trong ô của bảng vì vậy tôi đang thiết lập này trong tế bào cho hàng nhưng không làm việc
Chandni

67

Nếu bất cứ ai có vấn đề này trong iOS 8, tôi thấy rằng chỉ thiết lập các UITextView'sthuộc tính văn bản, sau đó gọi scrollRangeToVisiblevới một NSRangevới location:0, length:0, làm việc. Chế độ xem văn bản của tôi không thể chỉnh sửa được và tôi đã thử nghiệm cả có thể chọn và không thể chọn (không có cài đặt nào ảnh hưởng đến kết quả). Đây là một ví dụ Swift:

myTextView.text = "Text that is long enough to scroll"
myTextView.scrollRangeToVisible(NSRange(location:0, length:0))

cảm ơn, không có điều nào ở trên làm việc cho tôi. Mẫu của bạn đã làm.
dùng1244109

Tác phẩm này, nhưng chúng tôi có được một hình ảnh động cuộn mà cần phải bị vô hiệu hóa, tôi thích vô hiệu hóa cuộn và reenabling như @miguel gợi ý
Warpzit

Objective-C: [myTextView scrollRangeToVosystem: NSMakeRange (0, 0)];
Tuyên bố

Điều này dường như không hoạt động nữa. iOS 9 và Xcode 7.3.1: /
wasimsandhu

Swift 3 Stll hoạt động! :) chỉ cần sao chép dòng này trong phương thức UITextFielDelegate của bạn. 'TextViewDidEndEditing func (_ TextView: UITextView) {textView.scrollRangeToVisible (NSRange (địa điểm: 0, chiều dài: 0))} `
lifewithelliott

46

Và đây là giải pháp của tôi ...

    override func viewDidLoad() {
        textView.scrollEnabled = false
        textView.text = "your text"
    }

    override func viewDidAppear(animated: Bool) {
        textView.scrollEnabled = true
    }

5
Tôi không thích giải pháp này, nhưng ít nhất là kể từ iOS 9 beta 5, đó là thứ duy nhất phù hợp với tôi. Tôi giả định rằng hầu hết các giải pháp khác đều giả sử chế độ xem văn bản của bạn đã hiển thị. Trong trường hợp của tôi, điều đó không phải lúc nào cũng đúng, vì vậy tôi phải tiếp tục tắt cuộn cho đến khi nó xuất hiện.
robotspacer

1
Đây là điều duy nhất hiệu quả với tôi. iOS 9, sử dụng chế độ xem văn bản không thể chỉnh sửa.
SeanR

1
Điều này phù hợp với tôi, chế độ xem văn bản không thể chỉnh sửa trên iOS 8 với chuỗi phân bổ. In viewWillAppear - không hoạt động
Tina Zh

Tôi đồng ý với @robotspacer. và giải pháp này vẫn là giải pháp duy nhất phù hợp với tôi.
lerp90

Đối với tôi, giải pháp này chỉ hoạt động với các văn bản ngắn (được quy). Khi có các văn bản dài hơn, lỗi cuộn UITextView vẫn tồn tại :-) Giải pháp (hơi xấu xí) của tôi là sử dụng Dispatch_ after với độ trễ 2 giây để kích hoạt lại cuộn. UITextView dường như cần một lượng nhỏ thời gian để làm bố trí văn bản của nó ...
LaborEtArs

38

Kêu gọi

scrollRangeToVisible(NSMakeRange(0, 0))

hoạt động nhưng gọi nó trong

override func viewDidAppear(animated: Bool)

4
Tôi khẳng định rằng nó chỉ hoạt động với tôi trong viewDidAppear.
eric f.

2
Đây là cái duy nhất phù hợp với tôi. Cám ơn. Nhưng làm thế nào để bạn tắt hoạt ảnh mà tôi thấy hơi khó chịu?
rockhammer

Mặc dù cách này hoạt động, giải pháp của tôi @Maria tốt hơn, vì giải pháp đó không hiển thị một "bước nhảy" ngắn.
Sipke Schoorstra

1
Tôi lấy lại bình luận cuối cùng của tôi; đây là câu trả lời tốt nhất cho tôi vì nó hoạt động trên cả iOS 10 và iOS 11, trong khi @ Maria câu trả lời không hoạt động tốt trên iOS 11.
Sipke Schoorstra

@SipkeSchoorstra, hãy xem câu trả lời của tôi bên dưới để làm cho nó hoạt động mà không có bất kỳ bước nhảy nào (sử dụng KVO).
Terry

29

Tôi đang sử dụng Chuỗi phân bổ trong HTML với chế độ xem văn bản không thể chỉnh sửa. Đặt độ lệch nội dung cũng không hoạt động đối với tôi. Điều này phù hợp với tôi: tắt tính năng cuộn được bật, đặt văn bản và sau đó bật lại tính năng cuộn

[yourTextView setScrollEnabled:NO];
yourTextView.text = yourtext;
[yourTextView setScrollEnabled:YES];

Tôi đã có một textView bên trong tableViewCell. Trong trường hợp này, textView được cuộn đến khoảng. 50%. Giải pháp này là đơn giản như hợp lý. Cảm ơn
Julian F. Weinert

1
@ JulianF.Weinert Điều này dường như không hoạt động đối với iOS10. Tôi gặp trường hợp tương tự như bạn với textView trong tableViewCell. Tôi không sử dụng khả năng chỉnh sửa của textView. Tôi chỉ muốn văn bản có thể cuộn được. Nhưng textView luôn được cuộn đến khoảng 50% như bạn đã nói. Tôi cũng đã thử tất cả các đề xuất khác với việc đặt setContentOffset và scrollRangeToVible trong bài đăng này. Không có tác dụng. Có điều gì khác bạn có thể đã làm để làm cho điều này thành công không?
JeffB6688

@ JeffB6688 xin lỗi, không. Đó thực sự là một thời gian dài ... Có thể là một câu chuyện khác của một bản phát hành iOS "mới"?
Julian F. Weinert

Nhưng không may là không hoàn hảo trên iOS 11.2. Onlu @RyanTCB 's câu trả lời công trình trên cả iOS 10 và iOS 11.
Sipke Schoorstra

Đây hoạt động tốt đối với tôi cho đến nay trên iOS 9, 10 và 11, nhưng tôi đã phải kích hoạt nó trong viewDidAppearnhư một phần của một nghiêm trọng rộng hơn về các bản sửa lỗi
MadProgrammer

19

Vì không có giải pháp nào trong số này hiệu quả với tôi và tôi đã lãng phí quá nhiều thời gian để ghép các giải pháp lại với nhau, điều này cuối cùng đã giải quyết được cho tôi.

override func viewWillAppear(animated: Bool) {
    dispatch_async(dispatch_get_main_queue(), {
        let desiredOffset = CGPoint(x: 0, y: -self.textView.contentInset.top)
        self.textView.setContentOffset(desiredOffset, animated: false)
    })
}

Điều này thực sự ngớ ngẩn rằng đây không phải là hành vi mặc định cho điều khiển này.

Tôi hy vọng điều này sẽ giúp ai đó khác.


2
Điều này rất hữu ích! Tôi cũng phải thêm: self.automaticallyAdjustsScrollViewInsets = NO; vào chế độ xem có chứa UITextView để nó hoạt động hoàn toàn.
jengelsma

Tôi chỉ làm cho nó hoạt động trong SWIFT 3, với một calc bù đắp khác self.textView.contentOffset.ydựa trên câu trả lời này: stackoverflow.com/a/25366126/1736679
Efren

Làm việc cho tôi khi tôi thích nghi với cú pháp mới nhất cho Swift 3
hawmack13

hoàn toàn đồng ý làm thế nào là điên rồ này? cảm ơn cho giải pháp
ajonno

17

Tôi không chắc liệu mình có hiểu câu hỏi của bạn hay không, nhưng bạn có đang cố cuộn chế độ xem lên đầu không? Nếu vậy bạn nên làm

[textview scrollRectToVisible:CGRectMake(0,0,1,1) animated:YES];


1
@SamStewart Liên kết dường như bị hỏng, luôn dẫn đến trang tài khoản của tôi (đã đăng nhập). Bạn có thể cung cấp thêm thông tin về giải pháp họ cung cấp ở đó không?
uliwitness

@uliwitness Đây là siêu thông tin cũ bây giờ, tôi muốn giới thiệu cố gắng một nguồn tài nguyên hiện đại hơn thay vì một bài cũ 8 năm. API iOS đã thay đổi đáng kể trong 8 năm đó.
Benjamin Sussman

1
Tôi đã cố gắng tìm thông tin mới hơn. Nếu bạn biết nơi tôi có thể tìm thấy nó, tôi sẽ đánh giá cao điều đó. Tuy nhiên có vẻ là vấn đề tương tự :(
uliwitness

13

Đối với iOS 10 và Swift 3, tôi đã làm:

override func viewDidLoad() {
    super.viewDidLoad()
    textview.isScrollEnabled = false
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    textView.isScrollEnabled = true
}

Làm việc cho tôi, không chắc liệu bạn có gặp sự cố với phiên bản Swift và iOS mới nhất hay không.


Một giải pháp hoàn hảo để làm theo!
iChirag 21/12/17

Tôi đang gặp sự cố cuộn với UITextView trong UIView được kiểm soát bởi UIPageViewController. (Các trang này hiển thị màn hình Trợ giúp / Giới thiệu của tôi.) Giải pháp của bạn hoạt động cho mọi trang ngoại trừ trang đầu tiên. Vuốt đến bất kỳ trang nào và quay lại trang đầu tiên sẽ sửa vị trí cuộn của trang đầu tiên đó. Tôi đã thử thêm .isScrollEnabled = False khác vào viewWillAppear nhưng điều này không có tác dụng. Tôi bối rối không hiểu tại sao trang đầu tiên hoạt động khác với phần còn lại.
Wayne Henderson

[cập nhật] Chỉ cần giải quyết nó! Giới thiệu độ trễ 0,5 giây trước khi trình kích hoạt .isScrollEnabled = true khắc phục sự cố tải đầu tiên.
Wayne Henderson

rất đẹp . . .
Maysam R

Làm việc như người ở. Giải pháp duy nhất phù hợp với tôi. Bạn là người đàn ông.
Ninja lười biếng,

10

Tôi có một câu trả lời được cập nhật sẽ có chế độ xem văn bản xuất hiện chính xác và người dùng không gặp phải hoạt ảnh cuộn.

override func viewWillAppear(animated: Bool) {
    dispatch_async(dispatch_get_main_queue(), {
        self.introductionText.scrollRangeToVisible(NSMakeRange(0, 0))
    })

Tại sao bạn đang làm trong hàng đợi chính, sin viewWillAppear đang chạy trên hàng đợi chính?
karthikPrabhu Alagu

1
Quá nhiều vệ tinh trước đây đối với tôi gọi lại nhưng nó giải quyết ở đây: stackoverflow.com/a/17490329/4750649
MacInnis

8

Đây là cách nó hoạt động trên iOS 9 Release để textView được cuộn lên trên trước khi xuất hiện trên màn hình

- (void)viewDidLoad
{
    [super viewDidLoad];
    textView.scrollEnabled = NO;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    textView.scrollEnabled = YES;
}

1
Điều này đã thực hiện thủ thuật. Thật tình cờ, nó đã dạy tôi một điều rất quan trọng: 'view' trong 'viewwillappear' không chỉ đề cập đến self.view, mà dường như là TẤT CẢ các lượt xem. Không?
Sjakelien

8

Đó là cách tôi đã làm nó

Swift 4:

extension UITextView {

    override open func draw(_ rect: CGRect)
    {
        super.draw(rect)
        setContentOffset(CGPoint.zero, animated: false)
    }

 }

Đây là phương pháp duy nhất mang lại kết quả tốt nhất cho tôi. Tôi ủng hộ.
SmoothBlue

7

Điều này đã làm việc cho tôi

  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    DispatchQueue.main.async {
      self.textView.scrollRangeToVisible(NSRange(location: 0, length: 0))
    }
  }

Điều này rất kỳ lạ. Trên hầu hết các thiết bị, việc kết nối cuộc gọi DispatchQueue.main.async(...là không cần thiết, nhưng vì một số lý do, trên (ví dụ) iPhone 5s (iOS 12.1), nó không hoạt động trừ khi bạn gửi. Nhưng theo báo cáo của ngăn xếp cuộc gọi trên trình gỡ lỗi, viewWillAppear() đã chạy trên hàng đợi chính trong mọi trường hợp ... - WTF, Apple ???
Nicolas Miari

2
Tôi cũng tự hỏi tại sao tôi phải gửi rõ ràng trên hàng đợi chính mặc dù tôi đang chạy tất cả các sự kiện trên hàng đợi chính. Nhưng điều này đã hiệu quả với tôi
Ankit garg

6

Hãy thử điều này để di chuyển con trỏ lên đầu văn bản.

NSRange r  = {0,0};
[yourTextView setSelectedRange:r];

Hãy xem nó diễn ra như thế nào. Đảm bảo rằng bạn gọi cuộc gọi này sau khi tất cả các sự kiện của bạn đã bắt đầu hoặc những gì bạn đang làm đã hoàn thành.


đã thử nó người đàn ông, không có may mắn. Nó dường như là một cái gì đó với FirstResponder. Bất cứ một đề nghị nào khác?
Sam Stewart

có cùng vấn đề với vị trí con trỏ, nó đã hoạt động với tôi ... +1 tuyệt vời cho điều đó.
Dhaval

Tôi đã nhận được hoạt ảnh từ dưới lên trên nhưng tôi không yêu cầu điều đó, vậy làm thế nào để loại bỏ điều đó.
Dhaval

2
Nó không cuộn lên trên cùng (ít hơn trên một vài pixel).
Dmitry

6

Vấn đề của tôi là đặt textView để cuộn lên đầu khi chế độ xem xuất hiện. Đối với iOS 10.3.2 và Swift 3.

Giải pháp 1:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // It doesn't work. Very strange.
    self.textView.setContentOffset(CGPoint.zero, animated: false)
}
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // It works, but with an animation effection.
    self.textView.setContentOffset(CGPoint.zero, animated: false)
}

Giải pháp 2:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // It works.       
    self.textView.contentOffset = CGPoint.zero
}

5

Kết hợp các câu trả lời trước đó, bây giờ nó sẽ hoạt động:

talePageText.scrollEnabled = false
talePageText.textColor = UIColor.blackColor()
talePageText.font = UIFont(name: "Bradley Hand", size: 24.0)
talePageText.contentOffset = CGPointZero
talePageText.scrollRangeToVisible(NSRange(location:0, length:0))
talePageText.scrollEnabled = true

lmao điều duy nhất làm việc cho tôi thật ngớ ngẩn. Tôi đã có thể loại bỏ scrollRangeToVisiblemặc dù.
Jordan H

Bạn sẽ cần thay thế NSRange (0,0) bằng NSMakeRange (0,0)
RobP

5
[txtView setContentOffset:CGPointMake(0.0, 0.0) animated:YES];

Dòng mã này phù hợp với tôi.


5

chỉ cần bạn có thể sử dụng mã này

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    textView.scrollRangeToVisible(NSMakeRange(0, 0))
}

4

Câu trả lời Swift 2:

textView.scrollEnabled = false

/* Set the content of your textView here */

textView.scrollEnabled = true

Điều này ngăn textView cuộn đến cuối văn bản sau khi thiết lập.


4

Trong Swift 3:

  • viewWillLayoutSubviews là nơi thực hiện các thay đổi. viewWillAppear cũng sẽ hoạt động, nhưng về mặt logic, bố cục phải được thực hiện trong viewWillLayoutSubviews .

  • Về phương thức, cả scrollRangeToVosystemsetContentOffset đều sẽ hoạt động. Tuy nhiên, setContentOffset cho phép tắt hoặc bật hoạt ảnh.

Giả sử UITextView được đặt tên là yourUITextView . Đây là mã:

// Connects to the TextView in the interface builder.
@IBOutlet weak var yourUITextView: UITextView!

/// Overrides the viewWillLayoutSubviews of the super class.
override func viewWillLayoutSubviews() {

    // Ensures the super class is happy.
    super.viewWillLayoutSubviews()

    // Option 1:
    // Scrolls to a range of text, (0,0) in this very case, animated.
    yourUITextView.scrollRangeToVisible(NSRange(location: 0, length: 0))

    // Option 2:
    // Sets the offset directly, optional animation.
    yourUITextView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
}

viewWillLayoutSubviews được gọi trên bất kỳ thay đổi kích thước chế độ xem nào. Đó thường không phải là những gì bạn muốn.
uliwitness

4

Tôi đã phải gọi bên trong viewDidLayoutSubviews sau (gọi bên trong viewDidLoad là quá sớm):

    myTextView.setContentOffset(.zero, animated: true)

không hoạt động trong mọi tình huống
Raja Saad

3

Điều này đã làm việc cho tôi. Nó dựa trên câu trả lời của RyanTCB nhưng nó là biến thể Objective-C của cùng một giải pháp:

- (void) viewWillAppear:(BOOL)animated {
    // For some reason the text view, which is a scroll view, did scroll to the end of the text which seems to hide the imprint etc at the beginning of the text.
    // On some devices it is not obvious that there is more text when the user scrolls up.
    // Therefore we need to scroll textView to the top.
    [self.textView scrollRangeToVisible:NSMakeRange(0, 0)];
}

3
-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    [textview setContentOffset:CGPointZero animated:NO];
}

viewWillLayoutSubviews được gọi trên bất kỳ thay đổi kích thước chế độ xem nào. Đó thường không phải là những gì bạn muốn.
uliwitness

3
-(void) viewDidAppear:(BOOL)animated{
[mytextView scrollRangeToVisible:NSMakeRange(0,0)];}

- (void)viewWillAppear:(BOOL)animated{
[mytextView scrollRangeToVisible:NSMakeRange(0,0)];}
  • ViewWillappearsẽ làm điều đó ngay lập tức trước khi người dùng có thể nhận thấy, nhưng ViewDidDisappearphần này sẽ tạo hoạt ảnh cho nó một cách lười biếng.
  • [mytextView setContentOffset:CGPointZero animated:YES]; đôi khi KHÔNG hoạt động (tôi không biết tại sao), vì vậy hãy sử dụng scrollrangetovisible.

3

Sự cố đã được giải quyết: iOS = 10.2 Swift 3 UITextView

Tôi chỉ sử dụng dòng sau:

displayText.contentOffset.y = 0

1
Đã hoạt động (iOS 10.3)! Tôi đã thêm nó vào bên trong viewDidLayoutSubviewsđể nó xảy ra khi màn hình xoay. Nếu không, phần bù nội dung sẽ bị lệch.
Pup

2
[self.textView scrollRectToVisible:CGRectMake(0, 0, 320, self.textView.frame.size.height) animated:NO];

Vui lòng chỉnh sửa với nhiều chi tiết hơn.
Schemetrical

2

Tôi đã gặp sự cố, nhưng trong trường hợp của tôi, textview là chế độ xem phụ của một số chế độ xem tùy chỉnh và đã thêm nó vào ViewController. Không có giải pháp nào phù hợp với tôi. Để giải quyết vấn đề, hãy thêm độ trễ 0,1 giây và sau đó kích hoạt cuộn. Nó đã làm việc cho tôi.

textView.isScrollEnabled = false
..
textView.text = // set your text here

let dispatchTime = DispatchTime.now() + 0.1
DispatchQueue.main.asyncAfter(deadline: dispatchTime) {
   self.textView.isScrollEnabled = true
}

1

Đối với tôi, mã này hoạt động tốt:

    textView.attributedText = newText //or textView.text = ...

    //this part of code scrolls to top
    textView.contentOffset.y = -64
    textView.scrollEnabled = false
    textView.layoutIfNeeded() //if don't work, try to delete this line
    textView.scrollEnabled = true

Để cuộn đến vị trí chính xác và hiển thị nó trên đầu màn hình, tôi sử dụng mã này:

    var scrollToLocation = 50 //<needed position>
    textView.contentOffset.y = textView.contentSize.height
    textView.scrollRangeToVisible(NSRange.init(location: scrollToLocation, length: 1))

Đặt contentOffset.y sẽ cuộn đến cuối văn bản, sau đó scrollRangeToVosystem sẽ cuộn đến giá trị của scrollToLocation. Do đó, vị trí cần thiết xuất hiện trong dòng đầu tiên của scrollView.


1

Đối với tôi trong iOS 9, nó ngừng hoạt động đối với tôi với chuỗi phân bổ có phương thức scrollRangeToVible (hàng 1 có phông chữ đậm, các hàng khác có phông chữ thông thường)

Vì vậy, tôi đã phải sử dụng:

textViewMain.attributedText = attributedString
textViewMain.scrollRangeToVisible(NSRange(location:0, length:0))
delay(0.0, closure: { 
                self.textViewMain.scrollRectToVisible(CGRectMake(0, 0, 10, 10), animated: false)
            })

nơi mà sự chậm trễ là:

func delay(delay:Double, closure:()->Void) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}

1

Hãy thử sử dụng giải pháp 2 dòng này:

view.layoutIfNeeded()
textView.contentOffset = CGPointMake(textView.contentInset.left, textView.contentInset.top)

Điều này đã làm việc cho tôi. UITextView của tôi ở bên trong UICollectionVewCell. Tôi nghi ngờ rằng cuộn scrollRangeToVisible đến chỗ sai trừ khi bố trí được tính đúng
John Fowler

1

Đây là mã của tôi. Nó hoạt động tốt.

class MyViewController: ... 
{
  private offsetY: CGFloat = 0
  @IBOutlet weak var textView: UITextView!
  ...

  override viewWillAppear(...) 
  {
      ...
      offsetY = self.textView.contentOffset.y
      ...
  }
  ...
  func refreshView() {
      let offSetY = textView.contentOffset.y
      self.textView.setContentOffset(CGPoint(x:0, y:0), animated: true)
      DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
        [unowned self] in
        self.textView.setContentOffset(CGPoint(x:0, y:self.offSetY), 
           animated: true)
        self.textView.setNeedsDisplay()
      }
  }
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.