UITableView เริ่มต้นด้วยการชดเชยใน iOS 7


115

ฉันได้ลาก UITableView เจนธรรมดาไปยัง UIViewController ใน iOS 7

ตอนนี้มีการชดเชยช่องว่างในแนวตั้งก่อนที่เซลล์แรกจะเริ่มต้น ฉันจะกำจัดมันได้อย่างไร? ฉันต้องการให้บรรทัดแรกใกล้กับขอบด้านบนของจุดเริ่มต้นของ UITableView มากขึ้น ฉันไม่ได้ขอค่าชดเชยจำนวนมากใช่หรือไม่?

ใส่คำอธิบายภาพที่นี่

ความคิดใด ๆ ?


43
ฉันได้รับความช่วยเหลือจากสิ่งต่อไปนี้ YouStoryboard.storyboard> YouViewController> Attributes inspector> Uncheck - Adjust scroll view insets
Alexander

17
btw คุณสามารถจับภาพหน้าจอของ iOS Simulator โดยใช้Command key + S
Hemang

@ อเล็กซานเดอร์: ฉันได้รับความช่วยเหลือตามคำแนะนำของคุณเช่นกันอย่างไรก็ตามการยกเลิกการเลือก ExtendEdges UnderTopBars ทำให้พื้นที่ออฟเซ็ตแนวตั้งปรากฏขึ้นอีกครั้ง ฉันไม่แน่ใจว่าเป็นหนึ่งในข้อบกพร่อง (หลาย?) ใน Xcode6 แต่ปัญหาเหล่านี้ทำให้ฉันปวดหัวเป็นครั้งคราว!
iOS-Coder

คำตอบ:


81

โดยค่าเริ่มต้นตัวควบคุมมุมมองตารางจะวางเนื้อหาลงใต้แถบนำทางเพื่อให้คุณสามารถเลื่อนเนื้อหาข้างใต้และดูได้ในสถานะเบลอใต้แถบนำทาง / แถบเครื่องมือ

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

ไปที่กระดานเรื่องราว / xib ใน IB และยกเลิกการเลือกเนื้อหารายการใต้แถบนำทาง


6
ขออภัยความคิดเห็นเกี่ยวกับ NDA บน iOS7 ไม่เกี่ยวข้องอย่างไร นี่คือเว็บบอร์ดเพื่อช่วยเหลือผู้คน
Cocoadelica

ใน Xcode เวอร์ชัน 5.1 บน Viewcontroller ให้ยกเลิกการเลือกขอบขยาย> ใต้แถบด้านบนเพื่อลบสิ่งที่ใส่เข้าไปในเนื้อหา UITableView ด้านบน
Emel Elias

3
ดังนั้นเนื้อหาการแสดงภายใต้แถบนำทาง thigo อยู่ที่ไหน? ฉันหาไม่เจอ
Anup Kattel

10
@FrankGorman ใน Xcode 5.1.1 มีตัวเลือกในสตอรี่บอร์ดสำหรับตัวควบคุมมุมมองเฉพาะคือAdjust Scroll View insetsลบเครื่องหมายถูกออก
โคราช

1
เฮ้ @koratprashant. ความคิดเห็นที่มีประโยชน์มาก
KDeogharkar

107

การใช้งานiOS 7ใหม่ของUIViewControllerมีชุดตัวเลือกใหม่ที่ช่วยให้นักพัฒนาสามารถเลือกได้ว่าระบบจะเพิ่มสิ่งที่ใส่เข้าไปสำหรับUIScrollView , UITableViewและอนุพันธ์โดยอัตโนมัติหรือไม่

หากต้องการปิดใช้งานพฤติกรรมนี้ให้ยกเลิกการเลือกช่องเหล่านี้สำหรับ UIViewControllers ที่คุณต้องการทั้งหมดใน InterfaceBuilder บนตัวตรวจสอบวัตถุที่เลือกUIViewController :

ดูตัวตรวจสอบตัวควบคุม

สำหรับรายละเอียดเพิ่มเติม:

  1. ส่งแอป iOS 7 ของคุณวันนี้
  2. คู่มือการเปลี่ยน UI ของ iOS 7> ลักษณะที่ปรากฏและพฤติกรรม

ขอบคุณ! คุณช่วยฉันไว้.
rsc

68

จากคู่มือการเปลี่ยน iOS7:

หากคุณไม่ต้องการให้แทรกเนื้อหาของมุมมองแบบเลื่อนโดยอัตโนมัติให้ตั้งค่า automaticAdjustsScrollViewInsets เป็น NO (ค่าเริ่มต้นของ automaticAdjustsScrollViewInsets คือใช่)

   self.automaticallyAdjustsScrollViewInsets = NO;

9
นอกจากนี้ยังสามารถตั้งค่าใน XCode บนตัวตรวจสอบแอตทริบิวต์ ยกเลิกการAdjust Scroll View Insetsเลือกช่องทำเครื่องหมายสำหรับเค้าโครงตัวควบคุมมุมมอง
แอนดรูว์

1
หากคุณโหลด UIViewController โดยใช้โปรแกรม (โดยไม่ใช้ XIB) สิ่งนี้จะใช้งานได้ดี ตั้งค่าautomaticallyAdjustsScrollViewInsets = NOในตัวควบคุมมุมมอง
KabraBoja

นี่คือสำหรับฉัน สับสนเนื่องจาก TableView ของฉันอยู่ในมุมมองคอนเทนเนอร์และในตอนแรกก็ดูดี แต่มันเมาขึ้นเมื่อโผล่กลับมาจากตัวควบคุมมุมมองอื่น
13

ที่ดี! ประหยัดเวลาให้ฉันได้มาก!
inix

34

ฉันมีปัญหาที่คล้ายกันหลังจากปิด viewController contentOffset จาก tableView ของฉันเปลี่ยนเป็น (0, -64)

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

เป็นการควบคุมแรกในมุมมองระดับบนสุดดังนี้:

ก่อน

ฉันย้าย tableView ทันทีหลังจาก ImageView และใช้งานได้:

หลังจาก

ดูเหมือนว่าการวางมุมมองตารางในตำแหน่งแรกทำให้เกิดปัญหาและการย้ายมุมมองตารางไปยังตำแหน่งอื่นช่วยแก้ปัญหาได้

PD ฉันไม่ได้ใช้ autoLayout ทั้งสตอรี่บอร์ด

หวังว่านี่จะช่วยใครสักคนได้!


ฉันสังเกตเห็นสิ่งเดียวกัน! ฉันไม่ได้ใส่มุมมองเพิ่มเติมใด ๆ แต่เพียงแค่ชดเชยช่องว่างที่ขยับส่วนบนสุดของ UITableView -44 ใน IB ดูเหมือนว่าฉันต้องย้าย -64px แต่ในรันไทม์ -64px ทำให้ tablview ซ้อนทับแถบนำทางและ -44px ก็โอเค ฉันไม่สามารถอธิบายได้ ฉันพบปัญหานี้ในมุมมองป๊อปโอเวอร์ของ iPad เมื่อฉันไม่สังเกตเห็นปัญหาที่คล้ายกันในสตอรีบอร์ดของ iPhone
Mike Keskinov

ปัญหานี้เกิดขึ้นแม้กระทั่งกับ uiview หากมุมมองที่แสดงในอินเทอร์เฟซผู้ใช้ไม่ได้อยู่ในลำดับเดียวกัน
Rinku

2
วันนี้ฉันมีปัญหาเดียวกันกับ XCode 6.1 ชอล์กเสียเวลาอีก 2-3 ชั่วโมงโดยพยายามแก้ไขข้อบกพร่องของ Apple ...
Mike Gledhill

3
นี่เป็นประโยชน์อย่างยิ่งและสมควรได้รับความสนใจมากขึ้น! ไม่มีการเล่นซอกับการตั้งค่าตัวควบคุมมุมมองหรือการแทรกเนื้อหา / ออฟเซ็ตที่ช่วยได้ แต่การเปลี่ยนลำดับของมุมมองในสตอรีบอร์ดช่วยแก้ปัญหาให้ฉันได้
Caleb

1
Apple ฉันหมายถึง ... WTF? ขอบคุณมากนี่ยังแก้ไขสตอรี่บอร์ดด้วยการจัดวางอัตโนมัติ
Borzh

30

มันแก้ปัญหาที่คล้ายกันของฉัน:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}

1
คุณควรตรวจสอบเวอร์ชันของระบบด้วยวิธีนี้:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes

สิ่งนี้ใช้ได้ผลสำหรับฉันสำหรับปัญหาการเว้นระยะห่างที่ฉันมี แต่ตอนนี้สปินเนอร์ควบคุมแบบดึงเพื่อรีเฟรชของฉันแสดงขึ้นมาบดบังบางส่วน & ใต้เมนูด้านบนของฉัน ใครเห็นสิ่งนี้ด้วย? วิธีแก้ปัญหาใด ๆ
Nick

@ nickv2002 ลองสร้าง tableView แบบเป็นโปรแกรม
Alex

ฉันลองวิธีแก้ปัญหาอื่น ๆ ทั้งหมด แต่วิธีนี้ใช้ได้ผลกับฉัน
DanielR

13

ลองใช้สิ่งนี้

tableView.separatorInset = UIEdgeInsetsZero;

เห็นได้ชัดว่าหากคุณรองรับอะไรที่น้อยกว่า iOS7 คุณจะต้องตรวจสอบให้แน่ใจว่าวัตถุนั้นตอบสนองต่อตัวเลือกนี้ก่อนที่จะเรียกมัน


4
ไม่แน่ใจว่าเหตุใดจึงมีการโหวตขึ้น ... SeparatorInset เพียงแค่เปลี่ยนเส้นระยะห่างระหว่างเซลล์จะถูกแทรกจากขอบของมุมมอง คำถามคือถามเกี่ยวกับช่องว่างด้านบนและด้านล่างของเซลล์
Rembrandt Q. Einstein

รูปภาพทำให้เข้าใจผิด แต่การค้นหาโดย Google ทั่วไปสำหรับปัญหาระยะขอบทำให้หน้านี้
Will

9

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

หวังว่าจะช่วยใครบางคนได้ไม่กี่นาที Z.


1
ฉันพลาดไปโดยสิ้นเชิงดีใจที่พบคำตอบของคุณ UPVOTE
AamirR

8

ด้วย iOS 9 ไม่มีคำตอบอื่นใดจากหน้านี้ที่เหมาะกับฉัน (เช่นยกเลิกการเลือกช่องใน Storyboard ตั้งค่าautomaticallyAdjustsScrollViewInsetsเป็นNO)

วิธีแก้ปัญหาของฉันที่ฉันไม่พอใจจริงๆคือ:

- (void)viewDidAppear:(BOOL)animated {
    self.tableView.contentOffset = CGPointMake(0.0, 0.0);
    self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

บรรทัดเดียวกันviewWillAppearหรือviewDidLoadไม่ได้ผล


นี่น่าจะเป็นคำตอบเดียวสำหรับ uitableviewcontroller iOS 9 .... จริงๆแล้วไม่มีอะไรช่วยได้อีกแล้วและฉันได้ลองใช้ทั้งหมดแล้วคุณพบสิ่งนี้ที่ไหนหรือคุณคิดออกได้อย่างไร หลาย 10x
Erez

การยกเลิกการเลือกAdjust Scroll View insetsช่องทำเครื่องหมายใช้ได้กับ iOS 9
Adam

Adjust Scroll View insets ไม่ทำงานสำหรับฉันวิธีอื่นหรือไม่?
Yogesh Patel

5

บางครั้งฉันได้รับ64ช่องว่างความสูงที่ด้านบนสุดของมุมมองตารางเมื่อUIViewControllerฝังอยู่ในตัวควบคุมการนำทาง

ใส่คำอธิบายภาพที่นี่

ในอดีตฉันจะสร้างทุกอย่างขึ้นใหม่โดยหวังว่าข้อ จำกัด จะถูกต้องหลังจากกระดานชนวนที่สะอาด

TIL: หากคุณไม่ต้องการสร้างข้อ จำกัด ในแนวตั้งTop Layout GuideคุณสามารถกดOptionปุ่มค้างไว้เพื่อเข้าถึงไฟล์Container Margin.

ใส่คำอธิบายภาพที่นี่

จากนั้นให้แน่ใจว่าคงมีการตั้งค่าTop Space to Superview 0สิ่งนี้ได้ผลสำหรับฉันอย่างน้อย

ใส่คำอธิบายภาพที่นี่


1,5 ปีต่อมา แต่นั่นช่วยแก้ตอนเย็นของฉัน ขอบคุณ!
asp_net

4

สิ่งนี้ใช้ได้กับฉัน:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}

2

หากคุณเพิ่ม UIView ว่างก่อน UITableView (หรือมุมมองใด ๆ ที่เลื่อนได้เช่น ScrollView และ TextView) คุณสามารถมีโชคได้


1

ฉันมี UITableViewController ฝังอยู่ในมุมมองคอนเทนเนอร์ เพื่อกำจัดพื้นที่แนวตั้ง 64 จุดที่ไม่ต้องการฉันต้องยกเลิกการเลือก 'Adjust Scroll View Insets' ใน Interface Builder และตั้งค่า contentInset ของ UITableView ใน viewWillAppear ของ UITableViewController ของฉันดังต่อไปนี้

ขนาดของช่องว่างแนวตั้งจะตรงกับความสูงเฟรมของแถบนำทางและออฟเซ็ต y ปัญหาเกิดขึ้นเฉพาะบน iOS 7

- (void)viewWillAppear:(BOOL)animated;
{
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        const CGRect navBarFrame = self.navigationController.navigationBar.frame;
        const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
        self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
    }
}

1

ใน Xamarin iOS ฉันมีปัญหานี้เกิดขึ้นกับ UITableViewController ที่อยู่เบื้องหลังหลังจากที่กล่องโต้ตอบโมดอลเบื้องหน้าถูกปิด ในกระบวนการย้ายไปยังส่วนหน้า UITableViewController ได้ตั้งค่าสิ่งที่ใส่เข้าไป (บางแห่งโดย iOS):

ชั้นนี้แก้ไขได้

public class UITableViewControllerWithBugFix : UITableViewController {
    public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
    }

    public override void ViewWillLayoutSubviews() {
        if (TableView.ContentInset.Top != 0.0f)
            TableView.ContentInset = UIEdgeInsets.Zero;
        if (TableView.ScrollIndicatorInsets.Top != 0.0f)
            TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;

        base.ViewWillLayoutSubviews();
    }
}

1

บางครั้งฉันก็กลับไปสู่สถานการณ์ที่เลวร้ายนี้และฉันสังเกตเห็นว่ามันยังไม่เป็นที่รู้จัก เพื่อความทรงจำในอนาคต ...

เมื่อเร็ว ๆ นี้ฉันกำลังแก้ไขด้วยวิธีแก้ปัญหานี้

  1. เพิ่มมุมมองย่อยที่ด้านบนของ UITableView โดยมีความสูงเป็นศูนย์พิกเซล ทำงานร่วมกับ Autolayout หรือไม่มี
  2. ถ้าฉันรู้สึกมั่นใจ :-) ฉันจะลบมุมมองปลอมนี้แก้ไขข้อ จำกัด ด้านบนและใช้งานได้อย่างน่าอัศจรรย์

อย่าถามฉันว่าทำไมฉันยังคิดว่ามันเป็นข้อผิดพลาดใน UIKit


0

หากคุณไปที่สตอรีบอร์ดคุณสามารถเปลี่ยนออฟเซ็ตได้โดยเลือกตารางและภายใต้ส่วนมุมมองตารางในตัวตรวจสอบคุณสมบัติคุณเพียงแค่เปลี่ยนอินเซ็ตตัวคั่นทางด้านซ้ายเป็น 0


0

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


0

โซลูชัน Swift 3:

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}

0

ถ้าคุณฝัง TableViewController ของคุณใน NavigationController หรือ You have to constraint to margins instead of top Layout guide in StoryboardContainerView, Check constraint to margins when you are doing the constraintsไม่มีวิธีอื่นที่ใช้ได้ผลสำหรับฉัน ฉันไม่สามารถแสดงความคิดเห็นได้ดังนั้นฉันจึงย้ำคำตอบของ Robert Chens


0

ฉันลองหลายคำตอบ การเปลี่ยนการตั้งค่าในสตอรีบอร์ดทำให้เกิดปัญหาการกระเพื่อมกับเมนูภาพซ้อนทับที่ปรากฏขึ้นจากด้านซ้าย

ฉันมี UIViewController เปล่าในสตอรี่บอร์ดเท่านั้นมิฉะนั้นทุกอย่างจะถูกสร้างขึ้นโดยโปรแกรม

ฉันมีปัญหาเดียวกันกับ UITableView ภายใน UIView ภายใน UIViewController กล่าวคือส่วนหัวของส่วนเริ่มต้นไกลเกินไปเมื่อ UIViewController ฝังอยู่ในตัวควบคุมการนำทาง ไม่มีตัวควบคุมการนำทางทุกอย่างทำงานได้ดี

ในการแก้ไขปัญหาฉันได้สร้าง UILabel และด้วยข้อ จำกัด ทำให้ TableView ทำงานได้อย่างถูกต้อง

    inputsContainerView.addSubview(titleLabel)
    inputsContainerView.addSubview(tableView)

    // inputsContainerView
    ///////////////////////////////////////
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
    inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true

    // tableView
    ///////////////////////////////////////
    tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true

    // titleLabel - inserted to stop bad section header behavior
    ///////////////////////////////////////
    titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true

0

ฉันมีปัญหาเดียวกันใน iOS 11 และ xib, UITableviewController และฉันแก้ไขตามด้านล่าง

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.