iPhone ซ่อนแถบนำทางในหน้าแรกเท่านั้น


381

ฉันมีรหัสด้านล่างที่ซ่อนและแสดงแถบการนำทาง มันถูกซ่อนไว้เมื่อมุมมองแรกโหลดแล้วซ่อนเมื่อเรียกว่า "children" ปัญหาคือฉันไม่สามารถหากิจกรรม / การกระทำที่จะเรียกให้ซ่อนอีกครั้งเมื่อพวกเขากลับไปที่มุมมองรูต ....

ฉันมีปุ่ม "ทดสอบ" บนหน้ารูทที่ดำเนินการด้วยตนเอง แต่มันไม่สวยและฉันต้องการให้มันเป็นแบบอัตโนมัติ

-(void)hideBar 
{
    self.navController.navigationBarHidden = YES;
}
-(void)showBar 
{       
    self.navController.navigationBarHidden = NO;
}

คำตอบ:


1035

วิธีการแก้ปัญหาที่ดีที่สุดที่ฉันได้พบคือการทำต่อไปนี้ในการควบคุมมุมมองแรก

Objective-C

- (void)viewWillAppear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:NO animated:animated];
    [super viewWillDisappear:animated];
}

รวดเร็ว

override func viewWillAppear(animated: Bool) {
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
    super.viewWillAppear(animated)
}

override func viewWillDisappear(animated: Bool) {
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
    super.viewWillDisappear(animated)
} 

สิ่งนี้จะทำให้แถบการนำทางเคลื่อนไหวจากด้านซ้าย (พร้อมกับมุมมองถัดไป) เมื่อคุณกดถัดไปUIViewControllerบนสแต็กและทำให้เคลื่อนไหวไปทางซ้าย (พร้อมกับมุมมองเก่า) เมื่อคุณกดปุ่มย้อนกลับบนUINavigationBar.

โปรดทราบว่าเหล่านี้จะไม่มอบหมายวิธีการที่คุณจะเอาชนะUIViewControllerของการดำเนินการตามวิธีการเหล่านี้และเป็นไปตามเอกสารที่คุณต้องเรียกซุปเปอร์บางการดำเนินงานในการดำเนินงานของคุณ


2
หินนี้โดยสิ้นเชิง! ฉันดิ้นรนกับสิ่งนี้เป็นเวลาอย่างน้อยหนึ่งวัน ขอบคุณ !!!
James Testa

26
คำเตือน:สิ่งนี้จะสร้างบั๊กที่เลวร้ายมากเมื่อทำการ backswipe ที่รวดเร็ว สมมติว่า A (ไม่มี navbar) และ B (พร้อม navbar) ถูกพุชลงในสแต็ก เมื่อดู B และทำการย้อนกลับอย่างรวดเร็ว แต่ปล่อยเร็วพอที่จะอยู่บน B แถบนำทางจะยังคงซ่อนอยู่ ตอนนี้ไม่มีทางที่จะกลับไปอีกแล้ว animated=YESนี่คือสาเหตุที่ ฉันรู้ว่ามันดูน่าเกลียดด้วยanimated=NOแต่ดูเหมือนว่าเมื่อภาพเคลื่อนไหวสำหรับซ่อนแถบนำทางยังไม่เสร็จสิ้นดังนั้นภาพเคลื่อนไหวที่แสดงมันอีกครั้งจะถูกละเว้น ยังไม่มีวิธีแก้ปัญหา
fabb

3
ใน Swift: override func viewWillAppear (animated: Bool) {self.navigationController? .setNavigationBarHidden (true, animated: true) super.viewWillAppear (true)} แทนที่ func viewWillDisappear (เคลื่อนไหว: Bool) {self.navigationController? .setNavigationBarHidden เคลื่อนไหว: false) super.viewWillDisappear (true)}
Kitson

7
คำถามได้รับคำตอบในปี 2010 และช่วยฉันในตอนท้ายของปี 2015! ขอบคุณ.
oyalhi

1
นี่คือสิ่งที่ฉันเรียกว่าคำตอบในตำนาน เพื่อนเคล็ดลับสุดยอด แม้ทำงานหลังจากผ่านไปหลายทศวรรษ ... ใช้งานได้รวดเร็วและไร้ที่ติ +1 สำหรับคำตอบของคุณ @Alan โรเจอร์ส
onCompletion

62

อีกวิธีที่ฉันพบคือการตั้งผู้แทนสำหรับNavigationController:

navigationController.delegate = self;

และใช้setNavigationBarHiddenในnavigationController:willShowViewController:animated:

- (void)navigationController:(UINavigationController *)navigationController 
      willShowViewController:(UIViewController *)viewController 
                    animated:(BOOL)animated 
{   
    // Hide the nav bar if going home.
    BOOL hide = viewController != homeViewController;
    [navigationController setNavigationBarHidden:hide animated:animated];
}

วิธีง่ายๆในการปรับแต่งพฤติกรรมสำหรับทุกViewControllerคนในที่เดียว


สิ่งนี้จะได้รับการเรียกเมื่อใด
Zalak Patel

1
โซลูชั่นที่สมบูรณ์แบบ นี่ควรเป็นคำตอบที่ยอมรับได้ ขอบคุณ!
Samah

คำตอบที่สมบูรณ์แบบ มันยังใช้งานได้ในกรณีที่เราไม่สามารถแทนที่เมธอด viewWillAppear และ viewWillDisappear บนคอนโทรลเลอร์มุมมองแรกได้
pjuzeliunas

1
น่ากลัว คำตอบที่เลือกใช้งานได้ แต่ในแอปง่าย ๆ เท่านั้น คำตอบนี้ใช้ได้เมื่อแถบนำทางอยู่ในตัวควบคุมแท็บและดัน / นำเสนอ VC ต่างๆในรูปแบบต่างๆ
Jonathan Winger-Lang

นี่คือคำตอบที่ดีที่สุด คำตอบด้านบนอาจเกิดข้อผิดพลาดตามคำอธิบายของ@ fabb
Ryan.Yuen

18

หนึ่งบิดเล็กน้อยที่ฉันต้องทำกับคำตอบอื่น ๆ คือการยกเลิกการซ่อนแถบใน viewWillDisappear หากเหตุผลที่มันหายไปเป็นเพราะรายการนำทางถูกผลักมัน นี่เป็นเพราะมุมมองสามารถหายไปได้ด้วยเหตุผลอื่น

ดังนั้นฉันจะยกเลิกการซ่อนแถบเท่านั้นหากมุมมองนี้ไม่ใช่มุมมองระดับบนสุดอีกต่อไป:

- (void) viewWillDisappear:(BOOL)animated
{
    if (self.navigationController.topViewController != self)
    {
        [self.navigationController setNavigationBarHidden:NO animated:animated];
    }

    [super viewWillDisappear:animated];
}

3
+1, โดยปกติคุณไม่ต้องการแสดงแถบการนำทางเมื่อกดกล่องโต้ตอบโมดอล
João Portela

17

ฉันจะใส่รหัสในผู้รับมอบสิทธิ์viewWillAppearในแต่ละมุมมองที่แสดง:

เช่นนี้คุณต้องซ่อนมัน

- (void)viewWillAppear:(BOOL)animated
{
        [yourObject hideBar];
}

เช่นนี้ที่คุณต้องการแสดง:

- (void)viewWillAppear:(BOOL)animated
{
        [yourObject showBar];
}

ลีถ้าสิ่งนี้แก้ปัญหาของคุณได้ให้ทำเครื่องหมายคำตอบ "ทางออก" ของ Pablo
Rog

2
ปัญหาเดียวของปัญหานี้คือแถบการนำทาง "ดึง" ออกมาและดูเมื่อคุณนำทางจากมุมมองหนึ่งไปยังอีกมุมมองหนึ่ง เป็นไปได้หรือไม่ที่จะไม่มีแถบนำทางในมุมมองแรกและเมื่อมุมมองที่สองเลื่อนเข้าที่ก็จะมีแถบนำทางโดยไม่มีการ popping ใด ๆ
Henning

2
@henning หากต้องการทำให้สไลด์ NavBar เข้า / ออกอย่างที่คุณคาดหวังคุณต้องใช้ setNavigationBarHidden: animated: ดูคำตอบของ Alan Rogers ด้านล่าง (ซึ่งควรได้รับการระบุว่าเป็น "โซลูชัน")
Nick Forge

2
คำตอบนี้ผิดเล็กน้อย (viewWill / DidAppear) ควรจะเรียก super ดูคำตอบของฉันด้านล่างเพื่อดูวิธีแก้ปัญหาที่คุณไม่จำเป็นต้องเพิ่มเข้าไปในตัวควบคุมมุมมองทุกคน
Alan Rogers

15

คำตอบที่ยอมรับในปัจจุบันไม่ตรงกับพฤติกรรมที่ตั้งใจอธิบายไว้ในคำถาม คำถามจะขอให้แถบการนำทางซ่อนอยู่ในตัวควบคุมรูทวิว แต่มองเห็นได้ทุกที่ แต่คำตอบที่ยอมรับจะซ่อนแถบนำทางไว้ในตัวควบคุมมุมมองเฉพาะ จะเกิดอะไรขึ้นเมื่ออินสแตนซ์อื่นของคอนโทรลเลอร์มุมมองแรกถูกผลักลงบนสแต็ก มันจะซ่อนแถบนำทางแม้ว่าเราจะไม่ได้ดูตัวควบคุมรูทวิว

แต่กลยุทธ์ของ@Chad M. ที่ใช้UINavigationControllerDelegateเป็นสิ่งที่ดีและนี่เป็นวิธีแก้ปัญหาที่สมบูรณ์ยิ่งขึ้น ขั้นตอน:

  1. ประเภทรอง UINavigationController
  2. ใช้-navigationController:willShowViewController:animatedวิธีการนี้เพื่อแสดงหรือซ่อนแถบนำทางขึ้นอยู่กับว่ามันแสดงตัวควบคุมมุมมองรูทหรือไม่
  3. แทนที่เมธอดการกำหนดค่าเริ่มต้นเพื่อตั้งค่าคลาสย่อย UINavigationController เป็นผู้รับมอบสิทธิ์ของตนเอง

รหัสที่สมบูรณ์สำหรับการแก้ปัญหานี้สามารถพบได้ในส่วนสำคัญนี้ นี่คือการnavigationController:willShowViewController:animatedดำเนินการ:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    /* Hide navigation bar if root controller */
    if ([viewController isEqual:[self.viewControllers firstObject]]) {
        [self setNavigationBarHidden:YES animated:animated];
    } else {
        [self setNavigationBarHidden:NO animated:animated];
    }
}

2
นี่เป็นคำตอบที่เหมาะสมกว่าคำตอบที่ได้รับการยอมรับ
Pavel Gurov

14

ใน Swift 3:

override func viewWillAppear(_ animated: Bool) {
    navigationController?.navigationBar.isHidden = true
    super.viewWillAppear(animated)
}


override func viewWillDisappear(_ animated: Bool) {
    if (navigationController?.topViewController != self) {
        navigationController?.navigationBar.isHidden = false
    }
    super.viewWillDisappear(animated)
}

คุณอธิบายได้ไหมว่าทำไมคุณถึงตรวจสอบ! = ตนเอง?
Kitson

2
@Kitson ตรวจสอบคำตอบของผู้ใช้ 486646: บิดเล็กน้อยหนึ่งที่ฉันต้องทำในคำตอบอื่น ๆ คือการเพียงซ่อนแถบใน viewWillDisappear หากเหตุผลที่มันหายไปเป็นเพราะรายการนำทางถูกผลักมัน นี่เป็นเพราะมุมมองสามารถหายไปได้ด้วยเหตุผลอื่น ดังนั้นฉันจะยกเลิกการซ่อนแถบเท่านั้นหากมุมมองนี้ไม่ใช่มุมมองระดับบนสุดอีกต่อไป
Eugene Braginets

ดูเหมือนว่าหากคุณใช้navcontroller.navagationBarHiddenมันจะทำให้ตัวควบคุมการนำทางทั้งหมด (ไม่มีการปัดไปมา) เพื่อให้มันทำงานฉันใช้navigationController?.navigationBar.hiddenแทน การกวาดยังคงทำงานอยู่และจะไม่ปล่อยให้มีที่ว่างเพราะดูเหมือนว่าจะอยู่ในมุมมองสแต็กหรือบางสิ่งบางอย่าง
Sirens

8

ให้เครดิตกับคำตอบของ @ chad-m

นี่คือเวอร์ชั่น Swift:

  1. สร้างไฟล์ใหม่ MyNavigationController.swift

import UIKit

class MyNavigationController: UINavigationController, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.delegate = self
    }

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController == self.viewControllers.first {
            self.setNavigationBarHidden(true, animated: animated)
        } else {
            self.setNavigationBarHidden(false, animated: animated)
        }
    }

}
  1. ตั้งค่าคลาส UINavigationController ของคุณใน StoryBoard เป็น MyNavigationController แค่ นั้นแหละ!MyNavigationController

ความแตกต่างระหว่างคำตอบของ chad-m และของฉัน:

  1. รับช่วงจาก UINavigationController ดังนั้นคุณจะไม่ทำให้เกิดมลภาวะ rootViewController ของคุณ

  2. ใช้self.viewControllers.firstแทนhomeViewControllerดังนั้นคุณจะไม่ทำเช่นนี้ 100 ครั้งสำหรับ 100 UINavigationControllers ของคุณใน 1 กระดานเรื่องราว


คิดว่านี่เป็นคำตอบที่สะอาดที่สุด ขอบคุณ
DaSilva

6

หลังจากการทดลองหลายครั้งที่นี่ฉันจะทำให้มันทำงานได้ในสิ่งที่ฉันต้องการได้อย่างไร นี่คือสิ่งที่ฉันพยายาม - ฉันมีมุมมองพร้อมรูปภาพ และฉันต้องการให้ภาพเต็มหน้าจอ - ฉันมีตัวควบคุมทิศทางพร้อม tabBar ด้วย ดังนั้นฉันต้องซ่อนมันด้วย - นอกจากนี้ความต้องการหลักของฉันไม่เพียง แต่ซ่อนอยู่ แต่ยังมีเอฟเฟกต์สีซีดจางในขณะที่แสดงและซ่อน

นี่คือวิธีที่ฉันได้ทำงาน

ขั้นตอนที่ 1 - ฉันมีภาพและผู้ใช้แตะที่ภาพหนึ่งครั้ง ผมจับท่าทางที่และผลักดันมันเข้าไปใหม่imageViewController, ในimageViewControllerผมต้องการที่จะมีภาพแบบเต็มหน้าจอ

- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {  
NSLog(@"Single tap");
ImageViewController *imageViewController =
[[ImageViewController alloc] initWithNibName:@"ImageViewController" bundle:nil];

godImageViewController.imgName  = // pass the image.
godImageViewController.hidesBottomBarWhenPushed=YES;// This is important to note. 

[self.navigationController pushViewController:godImageViewController animated:YES];
// If I remove the line below, then I get this error. [CALayer retain]: message sent to deallocated instance . 
// [godImageViewController release];
} 

ขั้นตอนที่ 2 - ขั้นตอนทั้งหมดด้านล่างนี้อยู่ใน ImageViewController

ขั้นตอนที่ 2.1 - ใน ViewDidLoad แสดง navBar

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSLog(@"viewDidLoad");
[[self navigationController] setNavigationBarHidden:NO animated:YES];
}

ขั้นตอนที่ 2.2 - ในviewDidAppearตั้งค่าตัวจับเวลาด้วยความล่าช้า (ฉันได้ตั้งไว้สำหรับความล่าช้า 1 วินาที) และหลังจากที่ล่าช้า ฉันกำลังใช้อัลฟาเพื่อใช้สีซีดจาง

- (void)viewDidAppear:(BOOL)animated
{
NSLog(@"viewDidAppear");

myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self     selector:@selector(fadeScreen) userInfo:nil repeats:NO];
}

- (void)fadeScreen
{
[UIView beginAnimations:nil context:nil]; // begins animation block
[UIView setAnimationDuration:1.95];        // sets animation duration
self.navigationController.navigationBar.alpha = 0.0;       // Fades the alpha channel of   this view to "0.0" over the animationDuration of "0.75" seconds
[UIView commitAnimations];   // commits the animation block.  This Block is done.
}

ขั้นตอนที่ 2.3 - ใต้viewWillAppearเพิ่มการแตะแท็บเดียวให้กับภาพและทำให้ navBar โปร่งแสง

- (void) viewWillAppear:(BOOL)animated
{

NSLog(@"viewWillAppear");


NSString *path = [[NSBundle mainBundle] pathForResource:self.imgName ofType:@"png"];

UIImage *theImage = [UIImage imageWithContentsOfFile:path];

self.imgView.image = theImage;

// add tap gestures 
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];  
[self.imgView addGestureRecognizer:singleTap];  
[singleTap release];  

// to make the image go full screen
self.navigationController.navigationBar.translucent=YES;
}

- (void)handleTap:(UIGestureRecognizer *)gestureRecognizer 
{ 
 NSLog(@"Handle Single tap");
 [self finishedFading];
  // fade again. You can choose to skip this can add a bool, if you want to fade again when user taps again. 
 myTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self  selector:@selector(fadeScreen) userInfo:nil repeats:NO];
 }

ขั้นตอนที่ 3 - ในที่สุดviewWillDisappearตรวจสอบให้แน่ใจว่าได้นำทุกสิ่งกลับมา

- (void)viewWillDisappear: (BOOL)animated 
{ 
self.hidesBottomBarWhenPushed = NO; 
self.navigationController.navigationBar.translucent=NO;

if (self.navigationController.topViewController != self)
{
    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

[super viewWillDisappear:animated];
}

4

ในกรณีที่ใครยังคงมีปัญหากับข้อผิดพลาด backswipe ยกเลิกอย่างรวดเร็ว @fabb แสดงความคิดเห็นในคำตอบที่ยอมรับ

ฉันจัดการเพื่อแก้ไขปัญหานี้โดยการเอาชนะviewDidLayoutSubviewsนอกเหนือไปจากviewWillAppear/viewWillDisappearที่แสดงด้านล่าง:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

//*** This is required to fix navigation bar forever disappear on fast backswipe bug.
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.navigationController?.setNavigationBarHidden(false, animated: false)
}

ในกรณีของฉันฉันสังเกตเห็นว่าเป็นเพราะตัวควบคุมมุมมองรูท (โดยที่ nav ซ่อนอยู่) และตัวควบคุมมุมมองแบบพุช (แสดงเป็น nav) มีรูปแบบแถบสถานะที่แตกต่างกัน (เช่นมืดและสว่าง) ในขณะที่คุณเริ่มต้นแบ็คipeไปที่ป็อปอัพคอนโทรลเลอร์มุมมองจะมีภาพเคลื่อนไหวสีของแถบสถานะเพิ่มเติม หากคุณปล่อยนิ้วของคุณเพื่อที่จะยกเลิกป๊อปอินเทอร์แอคทีฟในขณะที่ภาพเคลื่อนไหวของแถบสถานะไม่เสร็จสิ้นแถบนำทางจะหายไปตลอดกาล!

อย่างไรก็ตามข้อผิดพลาดนี้จะไม่เกิดขึ้นหากสไตล์แถบสถานะของตัวควบคุมมุมมองทั้งสองเหมือนกัน


1

หากสิ่งที่คุณต้องการคือการซ่อนแถบนำทางในตัวควบคุมอย่างสมบูรณ์วิธีแก้ปัญหาที่สะอาดกว่าคือในตัวควบคุมรูทมีสิ่งต่อไปนี้:

@implementation MainViewController
- (void)viewDidLoad {
    self.navigationController.navigationBarHidden=YES;
    //...extra code on view load  
}

เมื่อคุณดันมุมมองลูกในคอนโทรลเลอร์แถบการนำทางจะยังคงซ่อนอยู่ ถ้าคุณต้องการที่จะแสดงมันเพียงแค่ในเด็กคุณจะเพิ่มรหัสสำหรับการแสดงit(self.navigationController.navigationBarHidden=NO;)ในการviewWillAppearโทรกลับและในทำนองเดียวกันรหัสสำหรับการซ่อนบนviewWillDisappear


0

การใช้งานที่ง่ายที่สุดอาจเป็นเพียงให้แต่ละคอนโทรลเลอร์ดูระบุว่าแถบนำทางของมันถูกซ่อนอยู่หรือไม่ในviewWillAppear:animated:วิธีการ วิธีการเดียวกันนี้ทำงานได้ดีสำหรับการซ่อน / แสดงแถบเครื่องมือด้วย:

- (void)viewWillAppear:(BOOL)animated {
    [self.navigationController setToolbarHidden:YES/NO animated:animated];
    [super viewWillAppear:animated];
}

ที่จริงแล้วข้อเสนอแนะของฉันเหมาะสมกับแถบเครื่องมือเท่านั้นเนื่องจากการซ่อนแถบการนำทางโดยไม่มีการเรียกที่ตรงกันเพื่อแสดงว่าจะทำให้ผู้ใช้ไม่สามารถนำทางกลับจากมุมมองปัจจุบัน
SteveCaine

0

การซ่อนแถบนำทางในหน้าแรกนั้นสามารถทำได้ผ่านกระดานเรื่องราวเช่นกัน บนกระดานโกโตะนำร่องควบคุม Scene-> ป้าย และเลือกคุณสมบัติ ' ซ่อน ' จากตัวตรวจสอบแอตทริบิวต์คุณสมบัติการตรวจสอบนี่จะซ่อนแถบการนำทางที่เริ่มต้นจาก viewcontroller แรกจนกว่าจะสามารถมองเห็นได้สำหรับ viewcontroller ที่ต้องการ

แถบนำทางสามารถตั้งค่ากลับเป็นมองเห็นได้ในการเรียกกลับ ViewWillAppear ของ ViewController

-(void)viewWillAppear:(BOOL)animated {

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];                                                  
}

0

สวิฟท์ 4:

ในตัวควบคุมมุมมองที่คุณต้องการซ่อนแถบนำทาง

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
    super.viewWillAppear(animated)
}

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
    super.viewWillDisappear(animated)
}

-1

โดยใช้รหัสนี้ใน ViewController ของคุณคุณสามารถได้รับผลกระทบนี้จริง ๆ แล้วเคล็ดลับคือซ่อน navigationBar เมื่อเปิดตัวควบคุมนั้น

- (void)viewWillAppear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:YES animated:YES];
    [super viewWillAppear:animated];
}

และเลิกซ่อนแถบการนำทางเมื่อผู้ใช้ออกจากหน้านั้นทำเช่นนี้คือ viewWillDisappear

- (void)viewWillDisappear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:NO animated:YES];
    [super viewWillDisappear:animated];
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.