iOS 7: UITableView แสดงภายใต้แถบสถานะ


219

หน้าจอแรกของแอปพลิเคชันของฉันคือUITableViewControllerไม่มีแถบนำทางซึ่งหมายความว่าเนื้อหาจะไหลไปตามแถบสถานะจึงมีการชนกันของข้อความจำนวนมาก ฉันได้ปรับทั้งคุณสมบัติสำหรับUnder top barsและAdjust scroll view insetsที่จะหยุดมันจากการเลื่อนใต้ แต่ที่ค่าใช้จ่ายของการรักษาด้านบนของมุมมองตารางด้านล่าง ฉันพยายามตั้งค่าUITableViewเฟรมให้ออฟเซ็ตด้วย 20 พิกเซล แต่ดูเหมือนว่าจะไม่มีผลและในขณะนี้ฉันต้องการให้แอปเข้ากันได้กับ iOS 6 ฉันไม่สามารถข้ามไปที่กระดานเรื่องราว iOS 7 เพื่อบังคับให้มีการโหลดอัตโนมัติในการใช้งาน คู่มือความสูงสูงสุด มีใครพบวิธีแก้ปัญหาที่ใช้ได้กับทั้งสองรุ่นหรือไม่

สิ่งที่ฉันได้ลอง: การตั้งค่าedgesForExtendedLayoutการเปลี่ยนการตั้งค่าภายใน Storyboard สำหรับUnder top barsและAdjust scroll viewบังคับให้เฟรมไปยังพื้นที่ใหม่

ภาพที่มีค่าพันคำ: การไหลของแถบสถานะภายใต้


2
วิธีแก้ปัญหาอย่างรวดเร็วอาจจะเพิ่มส่วนหัวว่างเปล่า 20 พิกเซลลงในตารางเมื่อทำงานบน iOS 7
EricS

@EricS: ฉันมีUITableViewส่วนหัวอยู่ที่นั่นแล้วยังไหลภายใต้แถบสถานะ
Nicholas Smith

ทำไมไม่ใช้คู่มือเลย์เอาต์อัตโนมัติบน iOS 6 มันได้ผล.
สตีเวนฟิชเชอร์

คำตอบ:


366

สำหรับผู้ที่สนใจทำซ้ำสิ่งนี้เพียงทำตามขั้นตอนเหล่านี้:

  1. สร้างโครงการ iOS ใหม่
  2. เปิดกระดานเรื่องราวหลักและลบค่าเริ่มต้น / เริ่มต้น UIViewController
  3. ลากใหม่ UITableViewControllerจากคลังวัตถุ
  4. ตั้งเป็นตัวควบคุมมุมมองเริ่มต้น
  5. ฟีดตารางทดสอบข้อมูลบางอย่าง

หากคุณทำตามขั้นตอนข้างต้นเมื่อคุณเรียกใช้แอปคุณจะไม่เห็นสิ่งใดรวมถึงการทำเครื่องหมายในช่องทำเครื่องหมาย Xcode เพื่อ "ขยายขอบภายใต้ {บน, ล่าง, ทึบแสง} บาร์" เพื่อหยุดแถวแรกไม่ให้ปรากฏภายใต้แถบสถานะ และคุณไม่สามารถระบุที่อยู่นี้ทางโปรแกรม

เช่นในสถานการณ์ข้างต้นสิ่งต่อไปนี้จะไม่มีผล:

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

ปัญหานี้อาจทำให้หงุดหงิดมากและฉันเชื่อว่ามันเป็นจุดบกพร่องของแอปเปิ้ลโดยเฉพาะอย่างยิ่งเพราะมันแสดงให้เห็นใน pre-wired ของพวกเขาเองUITableViewControllerจากไลบรารีวัตถุ

ฉันไม่เห็นด้วยกับทุกคนที่พยายามจะแก้ปัญหานี้โดยใช้ "Magic Numbers" เช่น "ใช้ delta ขนาด 20px" การเขียนโปรแกรมแบบคู่อย่างแน่นหนานี้ไม่ใช่สิ่งที่ Apple ต้องการให้เราทำที่นี่

ฉันได้ค้นพบวิธีแก้ไขปัญหานี้สองวิธี:

  • รักษาUITableViewControllerฉากของ :
    หากคุณต้องการเก็บไว้UITableViewControllerในกระดานเรื่องราวโดยไม่ต้องวางมันลงในมุมมองอื่นด้วยตนเองคุณสามารถฝังUITableViewControllerในUINavigationController(ตัวแก้ไข> ฝังใน> ตัวควบคุมการนำทาง) และยกเลิกการเลือก "แสดงแถบนำทาง" ในตัวตรวจสอบ . วิธีนี้จะช่วยแก้ปัญหาโดยไม่จำเป็นต้องมีการปรับแต่งเพิ่มเติมและมันยังคงรักษาUITableViewControllerฉากของคุณในกระดานเรื่องราว

  • การใช้ AutoLayout และฝังUITableViewเข้าไปในมุมมองอื่น (ฉันเชื่อว่านี่เป็นวิธีที่ Apple ต้องการให้เราทำ) :
    สร้างที่ว่างเปล่าUIViewControllerแล้วลากของคุณUITableViewเข้าไป จากนั้นให้ลาก Ctrl จากUITableViewไปยังแถบสถานะ เมื่อเมาส์ไปถึงด้านล่างของแถบสถานะคุณจะเห็นลูกโป่งการเล่นอัตโนมัติที่ระบุว่า "คู่มือการจัดวางด้านบน" ปล่อยเมาส์แล้วเลือก "Vertical Spacing" ที่จะบอกระบบการจัดวางที่ด้านล่างของแถบสถานะ

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


5
FYI ตัวเลือกที่ 1 (ฝังในตัวควบคุมการนำทาง) ส่งผลให้เซลล์สามารถมองเห็นได้หลังแถบสถานะโปร่งแสงเมื่อคุณเลื่อนดูตาราง
RyanR

4
@ RyanR ฉันก็สังเกตเห็นเช่นกัน แต่ฉันคิดว่ามันก็โอเคในบางจุด Apple ทำสิ่งเดียวกันในมุมมองแท็บที่เปิดของอุปกรณ์พกพา Safari แท็บจะแสดงใต้แถบสถานะ โซลูชันตัวควบคุมทิศทางคือวิธีแก้ปัญหาที่ง่ายที่สุดฉันรูทมัน อย่างไรก็ตามแถบสถานะโปร่งแสงเป็นแนวคิดที่งี่เง่า
ความภาคภูมิใจ Chung

6
เมื่อฉันลากตัวควบคุมจากมุมมองตารางขึ้นไปฉันไม่เคยพบเจอในแถบสถานะ ไม่มีแถบสถานะที่มองเห็นได้ในมุมมองไม่แน่ใจว่าคุณหมายถึงอะไรที่นี่ ...
Jesse

4
ตัวเลือกที่ 2 ไม่ทำงานใน Xcode 5 การดำเนินการที่อธิบายไว้ (ctrl-drag) ไม่ควรทำงานเนื่องจากเป็นระบบ Outlets ที่เป็นเจ้าของ แต่แม้ว่าคุณจะลากไปยังแผนภูมิต้นไม้ทางด้านซ้ายด้วยตนเองแล้วเค้าโครงเลย์เอาต์ด้านบนไม่ทำงาน (ควรทำอย่างไร AFAICT - ฉันเชื่อว่านี่เป็นข้อผิดพลาดที่สำคัญอีกอย่างหนึ่งใน AutoLayout :( :()
Adam

3
@PrideChung มันดูโง่เมื่อใช้ส่วนหัวกับ tableview ที่เข้าพักส่วนหัวคงที่ด้านบนและองค์ประกอบที่จะหายไปอยู่ข้างหลัง - และ reapear เบื้องหลังแถบสถานะโปร่งใส ...
Ixx

86

หากคุณกำลังทำสิ่งต่าง ๆ อย่างเป็นระบบและกำลังใช้งานUITableViewControllerโดยไม่มีUINavigationControllerทางออกที่ดีที่สุดของคุณคือทำสิ่งต่อไปนี้ในviewDidLoad:

สวิฟท์ 3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

ก่อนหน้านี้สวิฟท์

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);

UITableViewControllerจะยังคงอยู่เบื้องหลังเลื่อนแถบสถานะ แต่จะไม่อยู่ภายใต้มันเมื่อเลื่อนไปด้านบน


1
คุณสามารถเพิ่มการตรวจสอบสำหรับเวอร์ชั่น OS> 7 และรองรับ OS ที่เก่ากว่าด้วย (ไม่มีสิ่งที่ใส่เข้าไป) มิฉะนั้นสิ่งนี้ทำงานได้ดีสำหรับวัตถุประสงค์ของฉัน
SimpsOff

8
ค่าความสูง Hardcoding ไม่ใช่ความคิดที่ดีที่สุด
Maciej Kozieł

3
ใช่ใช้topLayoutGuideความยาวแทน
lipka

10
ฉันจะใช้UIApplication.sharedApplication.statusBarFrame.size.heightแทน 20.
mojuba

นั่นคืออัปเดตเป็น UIApplication.shared.statusBarFrame.size.height ทุกวันนี้
asetniop

23

โปรดทราบ:นี่ใช้งานได้สำหรับฉันสำหรับการกำหนดค่าต่อไปนี้:

  • ไม่มีแถบนำทางที่ด้านบนของหน้าจอ (มุมมองตารางตรงกับแถบสถานะ)
  • มุมมองตารางไม่สามารถเลื่อนได้

หากข้อกำหนดสองข้อข้างต้นไม่ตรงตามระยะทางของคุณอาจแตกต่างกันไป

โพสต์ต้นฉบับ

ฉันสร้างมุมมองของฉันโดยทางโปรแกรมและท้ายที่สุดสิ่งนี้ก็ใช้ได้กับฉัน:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

แหล่งที่มา (ในส่วนTopLayoutGuideที่ด้านล่างของ pg.39)


ที่น่าสนใจ ... ฉันสามารถเรียกมันอย่างนั้นในโครงการของฉันโดยไม่มีปัญหาใด ๆ ... ฉันอาจมีโครงสร้างเค้าโครงมุมมองที่ง่ายกว่าที่คุณทำ คำแนะนำของคุณถูกต้องฉันจะทำการเปลี่ยนแปลงในคำตอบของฉัน
Stunner

ฉันบังเอิญพบปัญหาเมื่อหมุนแอปของฉัน หากคุณปิดใช้งานการหมุนคุณอาจไม่มีปัญหา
Jeremy

ฉันไม่ได้เปิดใช้งานการหมุนในโครงการของฉันและฉันเจอปัญหา แต่ก็ยังเป็นจุดที่ดี
Stunner

1
สำหรับทุกคนที่ใช้ตัวควบคุมคอนเทนเนอร์ของตัวเองนี่เป็นวิธีที่ถูกต้องในการปรับสถานะหรือแถบนำทางที่ขีดเส้นใต้!
Rafael Nobre

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

20

การเพิ่มคำตอบยอดนิยม:

หลังจากวิธีที่ 2 ในตอนแรกดูเหมือนจะไม่ทำงานฉันก็ทำการแก้ไขเพิ่มเติมและพบวิธีแก้ปัญหา

TLDR; คำตอบที่ 2 ของคำตอบยอดนิยมใช้งานได้เกือบ แต่สำหรับ xCode ctrl + บางรุ่นลากไปที่ "Top Layout Guide" และการเลือก Spacing แนวตั้งไม่ได้ทำอะไรเลย อย่างไรก็ตามโดยการปรับขนาดของมุมมองตารางก่อนจากนั้นจึงเลือกใช้งาน "Top Space to Guide Guide Layout"


  1. ลาก ViewController เปล่าไปยังกระดานเรื่องราว ดูคอนโทรลเลอร์

  2. ลากวัตถุ UITableView ลงในมุมมอง (ไม่ใช่ UITableViewController) จัดวางตำแหน่งให้อยู่กึ่งกลางโดยใช้แนวทางเลย์เอาต์สีน้ำเงิน

มุมมองตาราง ภาพกลาง

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

เพิ่มเซลล์มุมมองตาราง Reuse Identifier

  1. สร้างคลาสย่อยที่กำหนดเองของคุณของ UIViewController และเพิ่ม<UITableViewDataSource, UITableViewDelegate>โปรโตคอล อย่าลืมตั้ง ViewController ของสตอรี่บอร์ดเป็นคลาสนี้ใน Identity Inspector

  2. สร้างทางออกสำหรับ TableView ของคุณในไฟล์การนำไปใช้งานและตั้งชื่อว่า "tableView"

สร้าง Outlet tableView

  1. คลิกขวาที่ TableView และลาก dataSource และผู้รับมอบสิทธิ์ไปยัง ViewController ของคุณ

ตัวแทนแหล่งข้อมูล

ตอนนี้สำหรับบางส่วนของการไม่ตัดในแถบสถานะ

  1. คว้าขอบด้านบนของมุมมองตารางของคุณและเลื่อนลงไปที่หนึ่งในคำแนะนำรูปแบบอัตโนมัติสีน้ำเงินประที่อยู่ใกล้ด้านบน

ปรับขนาด

  1. ตอนนี้คุณสามารถควบคุมการลากจากมุมมองตารางไปด้านบนแล้วเลือกพื้นที่ว่างด้านบนไปที่คำแนะนำเค้าโครง

คู่มือการจัดวางพื้นที่บนสุดสู่เค้าโครง

  1. มันจะทำให้คุณมีข้อผิดพลาดเกี่ยวกับเค้าโครงที่ไม่ชัดเจนของ TableView เพียงเพิ่มข้อ จำกัด ที่ขาดหายไปและสิ่งที่คุณทำ

เพิ่มข้อ จำกัด ที่ขาดหายไป

ตอนนี้คุณสามารถตั้งค่ามุมมองตารางของคุณเหมือนปกติและมันจะไม่ตัดแถบสถานะ!


11
- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1


2
สลับ <= ถึง> และลบค่าว่างถ้า block
pfrank

1
การอ่านself.topLayoutGuide.lengthจากviewDidLayoutSubviewsจะทำให้เค้าโครงของมุมมองเด็กดูแย่ลง

@OLzh ในขณะที่ทำตามที่คุณอธิบาย self.tableView ไม่สามารถเลื่อน
DawnSong

8

เลือก UIViewController บนสตอรีบอร์ดของคุณเป็นตัวเลือกไม่เลือกขยายขอบด้านล่างแถบด้านบน ทำงานให้ฉัน :)


อนิจจาไม่ได้ผลสำหรับฉัน UITableViewController เริ่มต้นโดยสิ้นเชิงยังคงซ้อนทับแถบสถานะ ฉันไม่คิดว่าแถบสถานะจะถือว่าเป็นแถบด้านบน เพียงนำทางบาร์และแถบแท็บ
Andrew Duncan

ทางออกเดียวเท่านั้นที่เหมาะกับฉัน (โปรดทราบว่าคุณต้อง "ย่อ" มุมมองตารางใต้แถบสถานะใน IB และปรับปรุงข้อ จำกัด )
Martin Makarsky

ทำงานกับฉันใน Xcode 8 ด้วย UITableViewController
Edouard Barbier

8

นี่คือวิธีเขียนใน "Swift" การปรับคำตอบของ @ lipka:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)

ที่นี่ไม่อนุญาตอย่างรวดเร็วหรือ
uplearnedu.com

ทางออกเดียวที่เหมาะกับฉันนั่นไม่ได้ทำให้ฉันสร้าง UIVIewController
Shereef Marzouk

1
สิ่งนี้น้อยกว่าอุดมคติเพราะมันจะใส่ส่วนบนสุดไว้ที่ 20 แม้ในแนวนอนที่ไม่มีแถบสถานะเริ่มต้นใน ios8
voidref

ชุดรูปแบบนี้รองรับการกำหนดค่าใด ๆ ที่ดีสำหรับฉัน:- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
qix

5

สำหรับ Xcode 7 ให้ยกเลิกการทำเครื่องหมายที่ 'โปร่งแสง' สำหรับแถบนำทางที่ใช้งานได้สำหรับฉัน

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


ง่ายที่สุดเร็วที่สุดง่ายที่สุดปลอดภัยที่สุด? สารละลาย. ไม่ทราบว่าทำไมถึงมี upvotes น้อยมากเมื่อเทียบกับทุกอย่าง
Gruntcakes

3

สิ่งนี้จะแก้ไขสำหรับ UITableViewController (ไม่มีหมายเลขมายากล) สิ่งเดียวที่ฉันไม่สามารถแก้ไขได้คือถ้าคุณใช้สายโทรศัพท์ซึ่งในกรณีนี้ส่วนบนของ tableView ถูกดันลงมากเกินไป หากใครรู้วิธีแก้ปัญหาดังกล่าวโปรดแจ้งให้เราทราบ

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()    
        configureTableViewTop()
    }

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition({ (context) -> Void in
            }, completion: { (context) -> Void in
                self.configureTableViewTop()
        })
    }

    func configureTableViewTop() { 
        tableView.contentInset.top = UIApplication.sharedApplication().statusBarFrame.height
    }
}

2

ฉันไม่รู้ว่า Kosher เป็นอย่างไร แต่ฉันพบว่ารูปแบบนี้ทำให้มุมมองของ ViewController เลื่อนลงและให้แถบสถานะมีพื้นหลังที่มั่นคง:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Shove everything down if iOS 7 or later
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0f) {

        // Move the view down 20 pixels
        CGRect bounds = self.view.bounds;
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];

        // Create a solid color background for the status bar
        CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
        UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
        statusBar.backgroundColor = [UIColor redColor];
        [self.view addSubview:statusBar];
    }

แน่นอนแทนที่redColorด้วยสีอะไรก็ได้ที่คุณต้องการสำหรับพื้นหลัง

คุณจะต้องทำหนึ่งใน swizzles เพื่อกำหนดสีของตัวละคร / สัญลักษณ์ในแถบสถานะ ฉันใช้View controller-based status bar appearance = NOและStatus bar style = Opaque black styleในการเขียนเพื่อทำสิ่งนี้ทั่วโลก

ดูเหมือนว่าจะทำงานและฉันสนใจที่จะได้ยินข้อบกพร่องหรือปัญหาใด ๆ กับมัน


2

คำตอบของ chappjc ใช้งานได้ดีเมื่อทำงานกับ XIB

ฉันพบโซลูชันที่สะอาดที่สุดเมื่อสร้าง TableViewControllers โดยทางโปรแกรมคือการตัดอินสแตนซ์ UITableViewController ใน UIViewController อื่นและตั้งค่าข้อ จำกัด ตามลำดับ

นี่มันคือ:

UIViewController *containerLeftViewController = [[UIViewController alloc] init];
UITableViewController *tableViewController = [[UITableViewController alloc] init];

containerLeftViewController.view.backgroundColor = [UIColor redColor];

hostsAndMoreTableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[containerLeftViewController.view addSubview:tableViewController.view];

[containerLeftViewController addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:containerLeftViewController];

NSDictionary * viewsDict = @{ @"tableView": tableViewController.view ,
                              @"topGuide": containerLeftViewController.topLayoutGuide,
                              @"bottomGuide": containerLeftViewController.bottomLayoutGuide,
                              };
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide][tableView][bottomGuide]"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];

เสียงเชียร์เบ็น


1

ฉันคิดว่าวิธีการใช้ UITableViewController อาจแตกต่างจากที่คุณทำมาก่อนหน้านี้เล็กน้อย มันใช้งานได้สำหรับฉัน แต่คุณอาจไม่ใช่แฟนของมัน สิ่งที่ฉันทำคือมีตัวควบคุมมุมมองที่มีมุมมองคอนเทนเนอร์ที่ชี้ไปที่ UItableViewController ของฉัน วิธีนี้ฉันสามารถใช้ TopLayoutGuide ที่ให้ไว้ในกระดานเรื่องราวของฉัน เพียงเพิ่มข้อ จำกัด ลงในมุมมองคอนเทนเนอร์และคุณควรได้รับการดูแลทั้ง iOS7 และ iOS6


1

ฉันลงเอยด้วยการใช้มุมมองพิเศษที่มีพื้นหลังที่ต้องการเพิ่มหลัง TableView และวางไว้ใต้แถบสถานะ:

    self.CoverView = [[UIView alloc]init];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

    self.CoverView.frame = CGRectMake(0,0,self.view.bounds.size.width,20);
    }

    self.CoverView.backgroundColor = [UIColor whiteColor];
    self.TableView = [[UITableView alloc]initWithFrame:CGRectMake(0,
    self.CoverView.bounds.size.height,XXX, YYY)];
    [self.view addSubview:self.TableView];
    [self.view addSubview:self.CoverView];

มันไม่ได้สวยมาก แต่มันเป็นวิธีแก้ปัญหาที่ง่ายมากถ้าคุณต้องการทำงานกับมุมมองแบบ xib-less และทั้ง IOS6 และ IOS7


1

ฉันทำสิ่งนี้กับจอแสดงผล Retina / Non-Retina เป็น

BOOL isRetina = FALSE;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}

if (isRetina) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}

1

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

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // Fix up content offset to ensure the tableview isn't underlapping the status bar.
    self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0);
}

1

ใช้งานได้กับ swift 3 - ใน viewDidLoad ();

let statusBarHeight = UIApplication.shared.statusBarFrame.height

let insets = UIEdgeInsets(top: statusBarHeight, left: 0, bottom: 0, right: 0)
tableView.contentInset = insets
tableView.scrollIndicatorInsets = insets

รหัสนี้: 1. รับความสูงของแถบสถานะ 2. ให้ส่วนบนของตารางดูเนื้อหาแทรกตามความสูงของแถบสถานะ 3. ให้ตัวบ่งชี้การเลื่อนเป็นสิ่งที่ใส่เข้าไปเดียวกันซึ่งจะปรากฏใต้แถบสถานะ


1

สำหรับผู้ที่ชอบฉันจะค่อนข้างไม่ฝังของพวกเขาUITableViewControllerในUIViewControllerลองนี้

UITableViewControllerคลาสย่อยที่กำหนดเองสามารถผนวกมุมมองมาสก์ต่อท้ายการควบคุมของ tableView เพิ่มหน้ากากบน viewDidAppear และลบหน้ากากบน viewWillDisappear

private var statusBarMaskView: UIView!

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

    if let superview = self.tableView.superview {
        self.statusBarMaskView = UIView(frame: CGRect.zero)
        superview.insertSubview(self.statusBarMaskView, aboveSubview: self.tableView)
        self.statusBarMaskView.backgroundColor = self.tableView.backgroundColor

        // using a nice constraint layout library to set the frame
        self.statusBarMaskView.pinTop(to: superview)
        self.statusBarMaskView.pinLeft(to: superview)
        self.statusBarMaskView.pinRight(to: superview)
        self.statusBarMaskView.addHeightConstraint(with: 22.0)
        ////
    }
}

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

    self.statusBarMaskView.removeFromSuperview()
    self.statusBarMaskView = nil
}

0

ฉันมี UISearchBar ที่ด้านบนของ UITableView ของฉันและทำงานต่อไปนี้;

self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
self.tableView.contentOffset = CGPointMake(0, -20);

แบ่งปันและเพลิดเพลินกับ ...



0

วิธีแก้ปัญหาของ Abrahamchez https://developer.apple.com/library/ios/qa/qa1797/_index.html ทำงานให้ฉันได้ดังต่อไปนี้ ฉันมี UITableviewcontroller เดียวเป็นมุมมองเริ่มต้นของฉัน ฉันลองใช้รหัสออฟเซ็ตแล้วฝังใน navcon แต่ก็ไม่ได้แก้ไขความโปร่งใสของแถบสถานะ

เพิ่ม Viewcontroller และทำให้เป็นมุมมองเริ่มต้น สิ่งนี้จะแสดงให้คุณเห็นแนวทางที่สำคัญบน & ล่างเลย์เอาต์

ลาก Tableview เก่าไปยัง View ในคอนโทรลเลอร์ใหม่

ทำทุกสิ่งเพื่อติดตั้งตารางลงในคอนโทรลเลอร์ใหม่:

เปลี่ยนไฟล์ controller view เก่าของคุณเป็นสืบทอด / คลาสย่อยจาก UIViewController แทน UITableViewController

เพิ่ม UITableViewDataSource และ UITableViewDelegate ให้กับ. viewcontroller ของ

เชื่อมต่อสิ่งที่จำเป็นในกระดานเรื่องราวอีกครั้งเช่นแถบค้นหา

สิ่งสำคัญคือการตั้งค่าข้อ จำกัด เช่นเดียวกับใน Q&A ของ Apple ฉันไม่ได้รำคาญที่จะแทรกแถบเครื่องมือ ไม่แน่ใจในลำดับที่แน่นอน แต่ไอคอนสีแดงจะปรากฏขึ้นบน Layout Guide บางทีเมื่อฉันสร้างขึ้น ฉันคลิกและปล่อยให้ Xcode ติดตั้ง / ล้างข้อ จำกัด

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


0

ฉันกำลังใช้ UISplitViewController กับตัวควบคุมทิศทางและ tableviewcontroller สิ่งนี้ใช้ได้กับฉันในมุมมองหลักหลังจากลองใช้วิธีแก้ไขปัญหาต่าง ๆ ที่นี่:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {

    // Move the view down 20 pixels
    CGRect bounds = self.view.bounds;
    bounds.origin.y -= 20.0;
    [self.navigationController.view setBounds:bounds];

    // Create a solid color background for the status bar
    CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor whiteColor];
    [statusBar setAlpha:1.0f];
    [statusBar setOpaque:YES];
    [self.navigationController.view addSubview:statusBar];
}

มันคล้ายกับโซลูชันของ Hot Licks แต่ใช้มุมมองย่อยกับ navigationController


นี่เป็นคำตอบเดียวที่ใช้ได้กับฉันใน iOS 8!
SamB

0
override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}

0

นี่คือ Swift 2.3 โซลูชัน (Xcode 8.0) ฉันสร้างคลาสย่อยของ UITableView แล้ว

class MYCustomTableView: UITableView
{   
    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        contentInset    = UIEdgeInsetsZero
    }
}

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

อย่าลืมอัปเดต TableView ใน IB ของคุณ (ใน TableViewController หรือเพียงแค่ TableView ภายใน ViewController ของคุณ)


0

ฉันพบปัญหานี้ใน ios 11 แต่เลย์เอาต์นั้นถูกต้องสำหรับ ios 8 - 10.3.3 สำหรับกรณีของฉันฉันตั้งค่าข้อ จำกัด พื้นที่แนวตั้งเป็น Superview.Top Margin แทน Superview.Top ซึ่งใช้งานได้กับ ios 8 - 11

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


0

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

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


-1

ดูโซลูชันทั้งหมด: โครงการของฉันใช้ xib ดังนั้นการแก้ปัญหาด้วยกระดานเรื่องราวจึงไม่ได้ผลสำหรับฉัน self.edgesForExtendedLayout = UIRectEdgeNone; ใช้งานได้กับคอนโทรลเลอร์เท่านั้นหากแถบนำทางมองเห็นได้ แต่ถ้ามุมมองของคุณมีเพียงแถบสถานะนั่นจะไม่ทำงาน ดังนั้นฉันรวมสอง conditons

- (void) viewDidLayoutSubviews {
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {
    CGRect bounds = self.view.bounds;
    if(self.navigationController == nil || self.navigationController.isNavigationBarHidden == YES){
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];
    }
    else{
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }
}

ช่วยงานนี้


-2

หากคุณต้องการรองรับ iOS 6 คุณจะต้องเลื่อนมันลงตามเงื่อนไข นั่นคือใน iOS 7 คุณควรเลื่อนมันลง 20 คะแนน (ไม่ว่าจะโดยการframeปรับเปลี่ยนหรือใช้เลย์เอาต์อัตโนมัติ) และใน iOS 6 คุณปล่อยไว้ตามลำพัง ฉันไม่เชื่อว่าคุณสามารถทำได้ใน IB ดังนั้นคุณจะต้องทำมันในรหัส

แก้ไข

คุณสามารถทำสิ่งนี้ได้ใน IB โดยใช้ delta ของ iOS6 / iOS7 ตั้งตำแหน่งของคุณใน iOS 7 จากนั้นสำหรับ iOS 6 ตั้งค่า delta Y เป็น -20points ดูคำถาม SO นี้สำหรับข้อมูลเพิ่มเติม


การตั้งค่าเฟรมลงไม่ได้เปลี่ยนไปอย่างน่าเสียดาย
Nicholas Smith

มันใช้งานไม่ได้กับอะไร มุมมองตารางไม่เลื่อนลง?
Scott Berrevoets

ใช่มันยังคงอยู่ในตำแหน่งเดียวกัน ฉันได้พยายามself.view.frameและself.tableView.frameทั้งในและviewWillAppear viewDidLoadเพื่อความปลอดภัยฉันยังsetContentNeedsDisplayต้องบังคับให้วาดใหม่
Nicholas Smith

เปิดใช้งานเลย์เอาต์อัตโนมัติหรือไม่
Scott Berrevoets

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