UITableViewHeaderFooterView: Không thể thay đổi màu nền


124

Tôi đang cố gắng thay đổi màu nền của UITableViewHeaderFooterView. Mặc dù chế độ xem đang xuất hiện, màu nền vẫn là màu mặc định. Tôi đang nhận được một bản ghi từ xcode nói:

Đặt màu nền trên UITableViewHeaderFooterView đã không được chấp nhận. Vui lòng sử dụng contentView.backgroundColor thay thế.

Tuy nhiên, không có tùy chọn nào sau đây hoạt động:

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

Tôi cũng đã thử thay đổi màu nền của chế độ xem trong tệp xib.

Bất kỳ đề xuất? Cảm ơn.


2
trong iOS 13, hãy sử dụng contentView.backgroundColor cho tôi. Tôi nghĩ Apple đã cập nhật điều này
Tà Truhoada

Câu trả lời:


94

Bạn nên sử dụng myTableViewHeaderFooterView.tintColor hoặc gán chế độ xem nền tùy chỉnh cho myTableViewHeaderFooterView.backgroundView.


2
myTableViewHeaderFooterView.tintColor hoạt động hoàn hảo. Cảm ơn câu trả lời!
Chun

15
Không biết tại sao, nhưng đối với tôi tintColorkhông hoạt động trên iOS7. Tôi chỉ có thể thay đổi màu bằng cách chỉ định chế độ xem tùy chỉnh:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
skywinder

7
TintColor không phải là màu nền !!
João Nunes

189

iOS 8, 9, 10, 11 ...

Cách duy nhất để đặt bất kỳ màu nào (với bất kỳ alpha) là sử dụng backgroundView:

Nhanh

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;
    });

Phản hồi cho ý kiến

  • Không có tùy chọn nào khác đáng tin cậy hoạt động (mặc dù các ý kiến ​​dưới đây)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
  • các backgroundViewthay đổi kích cỡ tự động. (Không cần thêm các ràng buộc)

  • Kiểm soát alpha bằng UIColor(white: 0.5, alpha: 0.5)hoặc backgroundView.alpha = 0.5.
    (tất nhiên, bất kỳ màu nào cũng được)

  • Khi sử dụng XIB , hãy tạo chế độ xem gốc a UITableViewHeaderFooterViewvà liên kết backgroundViewchương trình:

    Đăng ký với:

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

    Tải với:

    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
    }

Bản giới thiệu

Phát lại hoạt hình

► Tìm giải pháp này trên GitHub và các chi tiết bổ sung trên Swift Recipes .


5
contentView không tồn tại đó là lý do tại sao. tintcolor là để màu không nhìn nền của nó. và màu nền bị phản đối. Do đó, cách của bạn là cách để làm cho nó hoạt động. Cú pháp mã đẹp Btw
João Nunes

@ JoãoNunes, với C # / Xamarin, cú pháp thậm chí còn gọn gàng hơn:view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
crishoj

Trong Xcode 6.1.1, bạn nhận được cảnh báo bảng điều khiển thời gian chạy:Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
Albert Bori

Với Xcode6.2 beta5, tôi vẫn nhận được cảnh báo tương tự. Phương pháp tạo UITableViewHeaderFooterView của tôi dựa trên việc tải xib tương tự như mã mẫu của Apple, TVAnimationsGestures. Tuy nhiên, TVAnimationGestures với Xcode6.2b5 không tạo ra bất kỳ thông báo cảnh báo nào. Mã Apple hoàn toàn không có chuỗi 'nền'. Tất nhiên, uitableVuewHeaderFooterview.contentView không có trong TVAnimationsGestures. Tôi không hiểu tại sao điều này xảy ra.
kmugitani 6/2/2015

7
Đối với những người vẫn nhận được cảnh báo: đảm bảo UITableViewHeaderFooterView không có bộ nềnColor trong IB.
Tuslareb

24

Trong iOS 7 contentView.backgroundColorlàm việc cho tôi, tintColorkhông.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Mặc dù clearColorkhông hiệu quả với tôi, nhưng giải pháp tôi tìm thấy là đặt thuộc backgroundViewtính thành hình ảnh trong suốt. Có lẽ nó sẽ giúp được ai đó:

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

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

Tôi nghĩ rằng đây là một cách tiếp cận tốt hơn câu trả lời của @SwiftArchitect (Mặc dù nó đã hoạt động). Thực tế là bạn không phải thêm một UIView mới làm cho nó tốt hơn. Làm việc hoàn hảo cho tôi.
Erick A. Montañez

14

Hãy chắc chắn rằng bạn đặt màu nền contentViewcho màu của bạn UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

Sau đó, nó sẽ làm việc.


iOS> = 10 chỉ!. Đối với iOS <10 sử dụng: backgroundView? .BackgroundColor = UIColor.white
Peter Kreinz

12

Đối với tôi, tôi đã thử mọi thứ đã nêu ở trên nhưng vẫn nhận được cảnh báo "Đặt màu nền trên UITableViewHeaderFooterView đã không được chấp nhận. Thay vào đó, vui lòng sử dụng contentView.backgroundColor." sau đó tôi đã thử điều này: trong tệp xib, màu nền cho chế độ xem tiêu đề đã được chọn để xóa màu thay vì mặc định khi tôi thay đổi nó thành mặc định cảnh báo biến mất. được điều này

Thay đổi điều này


7

Để có màu rõ ràng, tôi sử dụng

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

Nó có vẻ tốt với tôi.


1
Thiết lập backgroundView = UIView()và sau đó backgroundColor = .clearlà giải pháp làm việc duy nhất. Cảm ơn bạn.
Vive

7

Đối với màu nền vững chắc, cài đặt contentView.backgroundColorphải là đủ:

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

Đối với các màu có độ trong suốt, bao gồm cả .clearmàu, điều này không còn hoạt động:

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

Đối với tiêu đề phần trong suốt đầy đủ, đặt thuộc backgroundViewtính thành chế độ xem trống:

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

Tuy nhiên, hãy cẩn thận với các tác dụng phụ có thể. Trừ khi chế độ xem bảng được đặt thành "Được nhóm", các tiêu đề của phần sẽ chụp ở trên cùng khi cuộn xuống. Nếu các tiêu đề phần trong suốt, nội dung ô sẽ được nhìn xuyên qua, có thể trông không tuyệt vời.

Ở đây, phần tiêu đề có nền trong suốt:

nhập mô tả hình ảnh ở đây

Để ngăn chặn điều này, tốt hơn là đặt nền của tiêu đề phần thành màu đơn sắc (hoặc độ dốc) phù hợp với nền của chế độ xem bảng hoặc bộ điều khiển xem của bạn.

Ở đây, tiêu đề phần có nền gradient hoàn toàn mờ đục:

nhập mô tả hình ảnh ở đây


Thiên tài! Xác định một UIView trống cho nềnView hoàn toàn giải quyết được vấn đề cho tôi! Cảm ơn!
Luiz Dias

6

nhập mô tả hình ảnh ở đâyTrong trình xây dựng giao diện, kéo lên .xib của bạn, trên phần tử trên cùng, trong trình kiểm tra thuộc tính đặt màu nền thành mặc định. Sau đó, đi đến Chế độ xem nội dung và đặt màu nền ở đó (tham khảo https://github.com/jiecao-fm/SwiftTheme/issues/24 ).


4

Trên iOS9 headerView.backgroundView.backgroundColor hoạt động với tôi:

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

Trên iOS8 tôi đang sử dụng headerView.contentView.backgroundColormà không gặp vấn đề gì, nhưng bây giờ với iOS 9, tôi gặp phải một vấn đề kỳ lạ khiến màu nền không lấp đầy toàn bộ không gian của ô. Vì vậy, tôi đã thử headerView.backgroundColorvà tôi đã nhận được cùng một lỗi từ OP.

Đặt màu nền trên UITableViewHeaderFooterView đã không được chấp nhận. Vui lòng sử dụng contentView.backgroundColor thay thế.

Vì vậy, bây giờ mọi thứ hoạt động tuyệt vời và không có cảnh báo bằng cách sử dụng headerView.backgroundView.backgroundColor


4

nếu bạn đã tạo một lớp con tùy chỉnh UITableViewHeaderFooterViewvới xibtệp thì bạn nên ghi đè setBackgroundColor. Giữ nó trống

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

}

Và điều này sẽ giải quyết vấn đề của bạn.


Đây là câu trả lời đúng cho tôi. Mặc dù tôi không đặt bất kỳ màu nền nào trong HeaderFooterView nhưng thông báo cảnh báo sẽ xuất hiện trong nhật ký bảng điều khiển của tôi. Rất khó chịu!
stan liu

4

Nếu bạn đang tùy chỉnh một ô tiêu đề phần bằng Storyboard / Nib , thì hãy đảm bảo màu nền được mặc định cho chế độ xem "Tiêu đề phần bảng".

Và nếu bạn phân lớp UITableViewHeaderFooterViewvà sử dụng ngòi, thì việc bạn phải làm là tạo một IBOutletkhung nhìn cho nội dung và đặt tên cho nó, vd. containerView. Điều này không được nhầm lẫn với contentView, đó là cha mẹ của khung nhìn container này.

Với thiết lập đó, bạn thay đổi màu nền containerViewthay thế.


1

Tôi đã thử với chuỗi xuất hiệnWhenContainedIn và nó hoạt động với tôi.

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

1

có thể vì nền tảng không tồn tại

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

công việc đó cho tôi


1

iOS 12, Swift 5. Nếu bạn sẵn sàng (hoặc cố gắng!) Để sử dụng proxy xuất hiện, giải pháp sau đây hoạt động:

  1. Phân lớp UITableViewHeaderFooterView và hiển thị cài đặt proxy xuất hiện của riêng bạn.
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. Đặt proxy xuất hiện ở mức độ chi tiết mong muốn của bạn.
MySectionHeaderView.appearance().forceBackgroundColor = .red

hoặc là

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

1

Hãy quên đi những khó khăn.

Thêm vào dự án của bạn UITableViewHeaderFooterView+BGUpdate.swiftvới mã dưới đây:

extension UITableViewHeaderFooterView {

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

Cách sử dụng đơn giản như bạn mong đợi trước đây:

headerView.backgroundColor = .red

Ví dụ sử dụng :

1) Trong đại biểu tableView:viewForHeaderInSection::

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

hoặc là

2) Trong lớp xem tiêu đề tùy chỉnh của bạn:

class MyHeaderView: UITableViewHeaderFooterView {

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

Ok ... cách của bạn là tốt hơn. :) Cảm ơn
Eli Burke

1
Giải pháp này gây ra một vòng lặp đệ quy trên iOS 12.
Koppacetic

0

Đặt BackgroundView với màu rõ ràng hoạt động tốt cho các tiêu đề có thể nhìn thấy. Nếu bảng được cuộn để hiển thị các tiêu đề ở dưới cùng, giải pháp này thất bại.

Bảng PSMy chỉ bao gồm các tiêu đề mà không có bất kỳ ô nào.


0

Nhanh:

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

0

Tạo UIView và đặt màu nền, sau đó đặt thành self.backgroundView.

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

0

Tôi cảm thấy bắt buộc phải chia sẻ kinh nghiệm của tôi. Tôi đã có đoạn mã này hoạt động tốt với iOS 10 và iOS 11headerView?.contentView.backgroundColor = .lightGray

Sau đó, tôi bất ngờ quyết định triển khai ứng dụng cho iOS 9 vì có một số thiết bị (iPad mini một số thế hệ cũ không cập nhật cho bất kỳ HĐH nào ngoài 9) - Giải pháp duy nhất hoạt động cho tất cả iOS 9, 10 và 11 là để xác định chế độ xem cơ sở cho tiêu đề chứa tất cả các lần xem tiêu đề khác, nối nó từ bảng phân cảnh và đặt backgroundColor chế độ xem cơ sở đó.

Bạn sẽ muốn chú ý khi kết nối ổ cắm không gọi nó: backgroundViewvì đã có một thuộc tính có tên đó trong một số superclass. Tôi gọi cho tôicontainingView

Ngoài ra, khi đấu dây, điều khiển ổ cắm nhấp vào chế độ xem Document Outlineđể đảm bảo nó không được nối dâyfile owner


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

Trong khi điều này có thể trả lời câu hỏi, nó đã được gắn cờ để xem xét. Câu trả lời không có lời giải thích thường được coi là chất lượng thấp. Vui lòng cung cấp một số bình luận trong câu trả lời tại sao đây là câu trả lời chính xác.
Dan
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.