UITableViewHeaderFooterView: ไม่สามารถเปลี่ยนสีพื้นหลังได้


124

ฉันกำลังพยายามเปลี่ยนสีพื้นหลังของ UITableViewHeaderFooterView แม้ว่ามุมมองจะปรากฏขึ้น แต่สีพื้นหลังจะยังคงเป็นสีเริ่มต้น ฉันได้รับบันทึกจาก xcode ว่า:

การตั้งค่าสีพื้นหลังบน UITableViewHeaderFooterView เลิกใช้แล้ว โปรดใช้ contentView.backgroundColor แทน

อย่างไรก็ตามไม่มีตัวเลือกใดต่อไปนี้ทำงาน:

myTableViewHeaderFooterView.contentView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundColor = [UIColor blackColor];

ฉันได้ลองเปลี่ยนสีพื้นหลังของมุมมองในไฟล์ xib แล้ว

ข้อเสนอแนะใด ๆ ? ขอบคุณ


2
ใน iOS 13 ใช้ contentView.backgroundColor ทำงานให้ฉัน ฉันคิดว่า Apple อัปเดตสิ่งนี้
Tà Truhoada

คำตอบ:


95

คุณควรใช้ myTableViewHeaderFooterView.tintColor หรือกำหนดมุมมองพื้นหลังที่กำหนดเองให้กับ myTableViewHeaderFooterView.backgroundView


2
myTableViewHeaderFooterView.tintColor ทำงานได้อย่างสมบูรณ์ ขอบคุณสำหรับคำตอบ!
ชอน

15
ไม่รู้ว่าทำไม แต่สำหรับฉันtintColorไม่ทำงานบน iOS7 ฉันสามารถเปลี่ยนสีได้โดยกำหนดมุมมองที่กำหนดเองเท่านั้น:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
skywinder

7
TintColor ไม่ใช่สีพื้น !!
João Nunes

189

iOS 8, 9, 10, 11 ...

วิธีเดียวในการตั้งค่าสีใด ๆ (ด้วยอัลฟา) คือการใช้backgroundView:

รวดเร็ว

self.backgroundView = UIView(frame: self.bounds)
self.backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)

Obj-C

self.backgroundView = ({
    UIView * view = [[UIView alloc] initWithFrame:self.bounds];
    view.backgroundColor = [UIColor colorWithWhite: 0.5 alpha:0.5];
    view;
    });

การตอบสนองต่อความคิดเห็น

  • ตัวเลือกอื่น ๆ เหล่านี้ไม่สามารถใช้งานได้อย่างน่าเชื่อถือ(แม้จะมีความคิดเห็นด้านล่าง)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
  • backgroundViewมีการปรับขนาดโดยอัตโนมัติ (ไม่ต้องเพิ่มข้อ จำกัด )

  • อัลฟาควบคุมด้วยหรือUIColor(white: 0.5, alpha: 0.5) (แน่นอนว่าจะทำสีอะไรก็ได้)backgroundView.alpha = 0.5

  • เมื่อใช้XIBให้ดูรูท a UITableViewHeaderFooterViewและเชื่อมโยงbackgroundViewโปรแกรม:

    ลงทะเบียนกับ:

    tableView.register(UINib(nibName: "View", bundle: nil),
                       forHeaderFooterViewReuseIdentifier: "header")

    โหลดด้วย:

    override func tableView(_ tableView: UITableView,
                            viewForHeaderInSection section: Int) -> UIView? {
        if let header =
            tableView.dequeueReusableHeaderFooterView(withIdentifier: "header") {
            let backgroundView = UIView(frame: header.bounds)
            backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)
            header.backgroundView = backgroundView
            return header
        }
        return nil
    }

การสาธิต

↻เล่นภาพเคลื่อนไหวซ้ำ

►หาวิธีการแก้ปัญหานี้บนGitHubและรายละเอียดเพิ่มเติมเกี่ยวกับสวิฟท์สูตร


5
ไม่มี contentView นั่นคือเหตุผล tintcolor คือการย้อมมุมมองไม่ใช่พื้นหลัง และสีพื้นหลังเลิกใช้แล้ว ดังนั้นวิธีของคุณคือวิธีที่จะทำให้มันได้ผล Btw nice code syntax
João Nunes

@ JoãoNunesด้วย C # / Xamarin ไวยากรณ์นั้นดีกว่า:view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
crishoj

ใน Xcode 6.1.1 คุณจะได้รับคำเตือนคอนโซลรันไทม์:Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
Albert Bori

ด้วย Xcode6.2 beta5 ฉันยังคงได้รับคำเตือนเหมือนเดิม วิธีการสร้าง UITableViewHeaderFooterView ของฉันขึ้นอยู่กับการโหลด xib ซึ่งคล้ายกับโค้ดตัวอย่างของ Apple TVAnimationsGestures อย่างไรก็ตาม TVAnimationGestures กับ Xcode6.2b5 ไม่สร้างข้อความเตือนใด ๆ รหัส Apple ไม่มีสตริง "พื้นหลัง" เลย แน่นอน uitableVuewHeaderFooterview.contentView เป็นศูนย์ใน TVAnimationsGestures ฉันไม่เข้าใจว่าทำไมถึงเกิดขึ้น
kmugitani

7
สำหรับผู้ที่ยังคงได้รับคำเตือนโปรดตรวจสอบให้แน่ใจว่า UITableViewHeaderFooterView ไม่มี backgroundColor ที่ตั้งไว้ใน IB
Tuslareb

24

ใน iOS 7 contentView.backgroundColorทำงานให้ฉันtintColorไม่ได้

   headerView.contentView.backgroundColor = [UIColor blackColor];

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

UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 1), NO, 0.0);
UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

headerView.backgroundView = [[UIImageView alloc] initWithImage:blank];

ฉันคิดว่านี่เป็นแนวทางที่ดีกว่าคำตอบของ @SwiftArchitect (แม้ว่าจะได้ผล) การที่คุณไม่ต้องเพิ่ม UIView ใหม่ทำให้ดีขึ้น ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน
Erick A. Montañez

14

ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า backgroundColor ของcontentViewคุณUITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

จากนั้นมันจะทำงาน


iOS> = 10 เท่านั้น!. สำหรับ iOS <10 ให้ใช้: backgroundView? .backgroundColor = UIColor.white
Peter Kreinz

12

สำหรับฉันฉันลองทำทุกอย่างที่ระบุไว้ข้างต้นแล้ว แต่ก็ยังได้รับคำเตือน "การตั้งค่าสีพื้นหลังบน UITableViewHeaderFooterView เลิกใช้งานแล้วโปรดใช้ contentView.backgroundColor แทน" จากนั้นฉันลองสิ่งนี้: ภายในไฟล์ xib สีพื้นหลังสำหรับมุมมองส่วนหัวถูกเลือกให้ล้างสีแทนค่าเริ่มต้นเมื่อฉันเปลี่ยนเป็นค่าเริ่มต้นคำเตือนก็หายไป คือสิ่งนี้

เปลี่ยนเป็นสิ่งนี้


7

สำหรับสีที่ชัดเจนฉันใช้

self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundView = [UIView new];
self.backgroundView.backgroundColor = [UIColor clearColor];

ดูเหมือนว่าจะดีสำหรับฉัน


1
การตั้งค่าbackgroundView = UIView()แล้วbackgroundColor = .clearเป็นวิธีเดียวที่ใช้ได้ผล ขอบคุณ.
Vive

7

สำหรับสีพื้นหลังทึบการตั้งค่าcontentView.backgroundColorควรเพียงพอ:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.contentView.backgroundColor = .red // Works!
    }
}

สำหรับสีที่โปร่งใสรวมถึง.clearสีจะใช้ไม่ได้อีกต่อไป:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.contentView.backgroundColor = .clear // Does not work 😞
    }
}

สำหรับส่วนหัวแบบโปร่งใสทั้งหมดให้ตั้งค่าbackgroundViewคุณสมบัติเป็นมุมมองว่าง:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.backgroundView = UIView() // Works!
    }
}

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

ที่นี่ส่วนหัวมีพื้นหลังโปร่งใส:

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

เพื่อป้องกันปัญหานี้ควรตั้งค่าพื้นหลังของส่วนหัวเป็นสีทึบ (หรือไล่ระดับสี) ที่ตรงกับพื้นหลังของมุมมองตารางหรือตัวควบคุมมุมมองของคุณ

ที่นี่ส่วนหัวมีพื้นหลังไล่ระดับสีทึบทั้งหมด:

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


Genius! การกำหนด UIView ว่างสำหรับ backgroundView แก้ปัญหาให้ฉันได้โดยสิ้นเชิง! ขอบคุณ!
Luiz Dias

6

ใส่คำอธิบายภาพที่นี่ในตัวสร้างอินเทอร์เฟซดึง. xib ของคุณที่องค์ประกอบด้านบนในตัวตรวจสอบแอตทริบิวต์ตั้งค่าสีพื้นหลังเป็นค่าเริ่มต้น จากนั้นไปที่มุมมองเนื้อหาและตั้งค่าสีพื้นหลังที่นั่น (อ้างอิงถึงhttps://github.com/jiecao-fm/SwiftTheme/issues/24 )


4

บนiOS9 headerView.backgroundView.backgroundColorทำงานให้ฉัน:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    TableViewHeader *headerView = (TableViewHeader *)[super tableView:tableView viewForHeaderInSection:section];
    headerView.backgroundView.backgroundColor = [UIColor redColor];
}

บนiOS8ฉันใช้งานได้โดยheaderView.contentView.backgroundColorไม่มีปัญหา แต่ตอนนี้กับ iOS 9 ฉันได้รับปัญหาแปลก ๆ ที่ทำให้สีพื้นหลังไม่เต็มพื้นที่ทั้งหมดของเซลล์ ดังนั้นฉันจึงลองheaderView.backgroundColorและได้รับข้อผิดพลาดเดียวกันจาก OP

การตั้งค่าสีพื้นหลังบน UITableViewHeaderFooterView เลิกใช้แล้ว โปรดใช้ contentView.backgroundColor แทน

ตอนนี้ทุกอย่างทำงานได้ดีและไม่มีคำเตือนเมื่อใช้ headerView.backgroundView.backgroundColor


4

ถ้าคุณสร้าง subclass กำหนดเองUITableViewHeaderFooterViewกับไฟล์แล้วคุณควรแทนที่xib setBackgroundColorให้มันว่างเปล่า

-(void)setBackgroundColor:(UIColor *)backgroundColor {

}

และนี่จะช่วยแก้ปัญหาของคุณได้


นี่คือคำตอบที่ถูกต้องสำหรับฉัน แม้ว่าฉันจะไม่ได้ตั้งค่าสีพื้นหลังใน HeaderFooterView แต่ข้อความเตือนยังคงปรากฏในบันทึกคอนโซลของฉัน น่ารำคาญมาก!
stan liu

4

หากคุณกำลังปรับแต่งเซลล์ส่วนหัวของส่วนด้วย Storyboard / Nibให้ตรวจสอบว่าสีพื้นหลังเป็นค่าเริ่มต้นสำหรับมุมมอง "ส่วนหัวของส่วนตาราง"

และถ้าคุณซับคลาสUITableViewHeaderFooterViewและใช้หัวปากกาสิ่งที่คุณต้องทำคือสร้างIBOutletมุมมองเนื้อหาและตั้งชื่อเช่น containerView. อย่าสับสนกับcontentViewสิ่งนี้ซึ่งเป็นพาเรนต์ของมุมมองคอนเทนเนอร์นี้

ด้วยการตั้งค่าดังกล่าวคุณจะเปลี่ยนสีพื้นหลังcontainerViewแทน


1

ฉันลองใช้โซ่เมื่อปรากฏเมื่อมีอยู่แล้วและมันก็ใช้ได้ผลสำหรับฉัน

[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], [UITableView class], nil] 
         setBackgroundColor: [UIColor.grayColor]];

1

อาจเป็นเพราะไม่มี backgroundView

override func draw(_ rect: CGRect){
    // Drawing code
    let view = UIView()
    view.frame = rect
    self.backgroundView = view
    self.backgroundView?.backgroundColor = UIColor.yourColorHere
}

ที่ทำงานให้ฉัน


1

iOS 12, Swift 5 หากคุณเต็มใจ (หรือพยายาม!) ที่จะใช้พร็อกซีรูปลักษณ์วิธีแก้ปัญหาต่อไปนี้จะใช้ได้:

  1. คลาสย่อย UITableViewHeaderFooterView และเปิดเผยการตั้งค่าพร็อกซีลักษณะของคุณเอง
final class MySectionHeaderView: UITableViewHeaderFooterView {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)
    }

    @objc dynamic var forceBackgroundColor: UIColor? {
        get { return self.contentView.backgroundColor }
        set(color) {
            self.contentView.backgroundColor = color
            // if your color is not opaque, adjust backgroundView as well
            self.backgroundView?.backgroundColor = .clear
        }
    }
}
  1. ตั้งค่าพร็อกซีรูปลักษณ์ตามความละเอียดที่คุณต้องการ
MySectionHeaderView.appearance().forceBackgroundColor = .red

หรือ

MySectionHeaderView.appearance(whenContainedInInstancesOf: [MyOtherClass.self]).forceBackgroundColor = .red

1

ลืมความยากลำบาก

เพิ่มในโครงการของคุณUITableViewHeaderFooterView+BGUpdate.swiftด้วยรหัสด้านล่าง:

extension UITableViewHeaderFooterView {

    open override var backgroundColor: UIColor? {
        get {
            return self.backgroundColor
        }
        set {
            let bgView = UIView()
            bgView.backgroundColor = newValue
            backgroundView = bgView
        }
    }
}

การใช้งานง่ายอย่างที่คุณคาดไว้ก่อนหน้านี้:

headerView.backgroundColor = .red

ตัวอย่างการใช้งาน :

1) ในผู้ได้รับมอบหมายtableView:viewForHeaderInSection::

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tv.dequeueReusableHeaderFooterView(withIdentifier: "MyHeaderView")
    headerView.backgroundColor = .red // <- here
    return headerView
}

หรือ

2) ในคลาสมุมมองส่วนหัวที่กำหนดเองของคุณ:

class MyHeaderView: UITableViewHeaderFooterView {

    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = .red // <- here
    }
}

โอเค ... ทางของคุณดีกว่า :) ขอบคุณ
Eli Burke

1
วิธีนี้ทำให้เกิดการวนซ้ำบน iOS 12
Koppacetic

0

การตั้งค่า BackgroundView ด้วยสีที่ชัดเจนจะทำงานได้ดีสำหรับส่วนหัวที่มองเห็นได้ หากตารางถูกเลื่อนเพื่อแสดงส่วนหัวที่ด้านล่างการแก้ปัญหานี้จะล้มเหลว

ตาราง PSMy ประกอบด้วยเฉพาะส่วนหัวที่ไม่มีเซลล์ใด ๆ


0

สวิฟท์:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView {
    var headerView: TableViewHeader = super.tableView(tableView, viewForHeaderInSection: section) as! TableViewHeader
    headerView.backgroundView.backgroundColor = UIColor.redColor()
}

0

สร้าง UIView และตั้งค่าสีพื้นหลังจากนั้นตั้งค่าเป็น self.backgroundView

- (void)setupBackgroundColor:(UIColor *) color {
    UIView *bgView = [[UIView alloc] initWithFrame:self.bounds];
    bgView.backgroundColor = color;
    self.backgroundView = bgView;
}

0

ฉันรู้สึกถูกบังคับให้แบ่งปันประสบการณ์ของฉัน ฉันมีโค้ดชิ้นนี้ที่ใช้งานได้ดีกับ iOS 10 และ iOS 11headerView?.contentView.backgroundColor = .lightGray

ทันใดนั้นฉันก็ตัดสินใจที่จะปรับใช้แอปสำหรับ iOS 9 ในทันทีเนื่องจากมีอุปกรณ์บางอย่าง (iPad mini รุ่นเก่าบางรุ่นไม่อัปเดตเป็นระบบปฏิบัติการใด ๆ ที่เกิน 9) - โซลูชันเดียวที่ใช้ได้กับ iOS 9, 10 และ 11 ทั้งหมด คือการกำหนดมุมมองพื้นฐานสำหรับส่วนหัวที่มีมุมมองย่อยส่วนหัวอื่น ๆ ทั้งหมดต่อจากกระดานเรื่องราวและตั้งค่า backgroundColorมุมมองพื้นฐานนั้น

คุณจะต้องมีสติเมื่อเดินสายเต้าเสียบไม่ให้เรียก: backgroundViewเนื่องจากมีคุณสมบัติที่มีชื่อนั้นอยู่แล้วในบางแห่งsuperclassแห่ง ฉันเรียกของฉันcontainingView

นอกจากนี้เมื่อเดินสายไฟตัวควบคุมเต้าเสียบให้คลิกที่มุมมองDocument Outlineเพื่อให้แน่ใจว่าไม่ได้ต่อสายถึงfile owner


0
let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear

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