UITableview đã nhóm loại bỏ đường phân cách bên ngoài


77

Tôi có một UITableview được nhóm lại được tạo theo chương trình. Ngoài ra, tôi cũng có một ô có tệp xib được điền trong chế độ xem bảng theo chương trình. Càng xa càng tốt. Nhưng tôi chỉ muốn loại bỏ đường phân cách bên ngoài. Tôi đã sử dụng mã bên dưới nhưng lần này đã loại bỏ tất cả dòng phân cách.

self.tableView.separatorColor = [UIColor clearColor];

đây không phải là lựa chọn tốt cho tình huống của tôi. Đây là ảnh chụp màn hình những gì tôi muốn làm;

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


2
Tùy chọn một: Loại bỏ tất cả các dấu phân cách mặc định và thêm UIViews vào ô làm dấu phân tách giả. Hy vọng rằng có một lựa chọn tốt hơn.
Lord Zsolt

Đó là cách tiếp cận tương tự ở trên. Như tôi đã nói trước đây, tôi chỉ loại bỏ bên ngoài có nghĩa là dòng trên và dòng dưới cùng không phải dòng bên trong. Nếu tôi xóa tất cả dấu phân tách trong chế độ xem bảng và thêm dòng mới trong chế độ xem bảng ô tùy chỉnh, giao diện của chế độ xem bảng vẫn như cũ.
serhat sezer

4
Giải pháp là, sử dụng TableView dưới dạng Plain tableview, không phải Nhóm. Trong Grouped, nó đặt dấu phân cách trên đầu trang và chân trang.
iphonic

@iphonic giải pháp của bạn hoạt động, cảm ơn :), nhưng chế độ xem bảng đơn giản vẫn hiển thị dấu phân cách ngay cả khi nó không có gì.
li2

21
Đó có phải là nghiêm túc của bạn không, @iphonic ?! Ai nên giúp đỡ? li2? Khi ai đó sử dụng Chế độ xem bảng được nhóm thì rất có thể có lý do chính đáng cho điều đó. Bạn có bao giờ thấy rằng các dấu phân cách không phải là sự khác biệt duy nhất giữa Chế độ xem bảng được nhóm và Chế độ xem bảng đơn giản?
Julian F. Weinert

Câu trả lời:


15

Tôi vừa tìm ra một giải pháp, vì ô có contentViewđó là a UIView, vì vậy tôi nghĩ bạn có thể chỉ cần tập trung vào điểm mấu chốt của contentView.

Đây là mã của tôi:

đầu tiên, bạn phải tạo dải phân cách để xóa

tableView.separatorColor = UIColor.clear

Thứ hai, trong cellForRowAtchức năng:

let bottomBorder = CALayer()

bottomBorder.frame = CGRect(x: 0.0, y: 43.0, width: cell.contentView.frame.size.width, height: 1.0)
bottomBorder.backgroundColor = UIColor(white: 0.8, alpha: 1.0).cgColor
cell.contentView.layer.addSublayer(bottomBorder)

ở đây bạn sẽ thấy giao diện người dùng như thế này:

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


22

Bạn có thể xóa dấu phân cách ngay cả trong UITableView được nhóm với Static Cell:

class CustomCell: UITableViewCell {

override func layoutSubviews() {
    super.layoutSubviews()
    for view in subviews where view != contentView {
        view.removeFromSuperview()
    }
}

Nhưng trong iOS10 cũng sẽ xóa dòng giữa các ô trong một phần.
leo.tan

21

Đây là giải pháp của tôi:

self.tableView.separatorColor = self.tableView.backgroundColor

@xxtesaxx, bạn nên kiểm tra thực tế


9
Nó loại bỏ tất cả các dải phân cách
Tikhonov Alexander

5
@Brook Nó sẽ xóa tất cả dấu phân cách. Nếu bạn đọc câu hỏi của tôi, tôi đã nói rằng tôi chỉ muốn xóa các dòng "bên ngoài".
serhat sezer

2
@serhatsezer Có Tôi đã đọc câu hỏi của bạn, đây là một giải pháp thủ thuật, nó làm cho các đường bên ngoài "biến mất" và giữ cho các đường phân cách hiển thị.
Brook

@Brook Nhưng vấn đề sẽ xảy ra nếu tableView Màu nền khác với tách màu hoặc TableView nền có cùng màu như các tế bào .. hãy nói trắng ..
Kautsya Kanu

13

Google, ngay cả trong năm 2018, đang phân phát trang này như là kết quả hàng đầu cho câu hỏi này. Tôi đã không gặp may trong iOS 11 với bất kỳ câu trả lời nào được cung cấp, vì vậy đây là những gì tôi đã nghĩ ra:

extension UITableViewCell {
    func removeSectionSeparators() {
        for subview in subviews {
            if subview != contentView && subview.frame.width == frame.width {
                subview.removeFromSuperview()
            }
        }
    }
}

Việc gọi .removeSectionSeparators () trên bất kỳ cá thể UITableViewCell nào bây giờ sẽ giải quyết vấn đề. Trong trường hợp của tôi, ít nhất là các dấu phân tách phần là những dấu duy nhất có cùng chiều rộng với chính ô (vì các dấu khác đều được thụt lề).

Câu hỏi duy nhất còn lại là chúng ta nên gọi nó từ đâu. Bạn nghĩ willDisplayCell sẽ là lựa chọn tốt nhất, nhưng tôi phát hiện ra rằng lệnh gọi ban đầu xảy ra trước khi bản thân các khung nhìn phân tách được tạo, vì vậy không có xúc xắc.

Tôi đã kết thúc việc đưa cái này vào phương thức cellForRowAtIndexPath của mình ngay trước khi tôi trả về một ô được tải lại:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyReusableIdentifier", for: indexPath)

    Timer.scheduledTimer(withTimeInterval: 0.15, repeats: false) { (timer) in
        cell.removeSectionSeparators()
    }

    return cell
}

Nó không cảm thấy thanh lịch, nhưng tôi chưa gặp phải bất kỳ vấn đề nào.

CHỈNH SỬA: Có vẻ như chúng tôi cũng cần điều này (cho các ô được sử dụng lại):

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    cell.removeSectionSeparators()
}

Đây là trước / sau trong ảnh chụp màn hình với mã này:

Trước Trước khi loại bỏ dấu phân cách

Sau Sau khi loại bỏ dấu phân cách


1
Hoạt động như một sự quyến rũ, cảm ơn. Hoạt động tốt hơn nếu bạn gọi nó trong subviews bố trí cho lớp tùy chỉnh của bạn
TheJeff

1
Đây là điều duy nhất tôi có thể tìm thấy sẽ hoạt động cho iOS 11 trở đi. Cảm ơn.
jstr

Tôi cố gắng thực hiện cuộc gọi này willDisplayhoặc cellForRowAtcả hai đều không hoạt động về phía tôi. Tôi đang sử dụng iOS 14 và Swift5.
ChuckZHB

9

Sau khi kiểm tra phân cấp chế độ xem, có vẻ như mỗi UITableViewCell chỉ có ba chế độ xem phụ: chế độ xem nội dung ( UITableViewCellContentView) và hai chế độ xem phân tách ( _UITableViewCellSeparatorView). Tôi không phải là người thích tính năng tạo lớp động từ NSStrings (và Apple cũng vậy 😉). Tuy nhiên, vì contentViewa UITableViewCellcó thể truy cập được mà không cần sử dụng các API riêng, nên giải pháp hóa ra khá dễ dàng.

Ý tưởng chỉ là lặp lại các UITableViewCellchế độ xem phụ của bạn và xóa bất kỳ chế độ xem nào không phải là contentView:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    let subviews = cell.subviews
    if subviews.count >= 3 {
        for subview in subviews {
            if subview != cell.contentView {
                subview.removeFromSuperview()
                break
            }
        }
    }
}

tableView(:willDisplayCell:forRowAtIndexPath:)được gọi nhiều lần trong quá trình kết xuất chế độ xem bảng, vì vậy ở trên theo dõi trạng thái bằng cách kiểm tra xem ô có bao nhiêu lần xem con. Nếu nó có ba lần xem phụ, cả hai dấu phân cách vẫn còn nguyên vẹn. Nó cũng chỉ loại bỏ một trong các dấu phân cách, nhưng bạn có thể loại bỏ cả hai bằng cách xóa break. Bạn cũng có thể chỉ định xóa dấu phân cách trên cùng hay dấu phân tách dưới cùng bằng cách kiểm tra khung của chế độ xem phụ. Nếu điểm gốc trục y của khung là 0, đó là dấu phân cách trên cùng. Nếu không 0, nó là đáy.

Hi vọng điêu nay co ich!

Swift 4, Swift 4.2 Cập nhật:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let subviews = cell.subviews
    guard subviews.count >= 3 else {
        return
    }

    for subview in subviews where NSStringFromClass(subview.classForCoder) == "_UITableViewCellSeparatorView" {
        subview.removeFromSuperview()
    }
}

1
Cảm ơn bạn nhưng cách làm này có thể có vấn đề với các phiên bản iOS trong tương lai?
serhat sezer

2
Nhiều khả năng là không, trừ khi Apple thay đổi cấu trúc bên trong của tableview để có nhiều view nội dung. Nếu bạn muốn trở thành thậm chí cẩn thận hơn, bạn có cách khác có thể sử dụng NSStringFromClassvà so sánh những giá trị chống lại "_UITableViewCellSeparatorView""UITableViewCellContentView"và sau đó loại bỏ.
Dan Loewenherz

2
Apple đã thay đổi hệ thống phân cấp chế độ xem tableViewCell từ iOS 7 sang iOS 8, điều đó thực sự khiến tôi bị cháy trong một dự án vì tôi đã sử dụng mã như thế này, vì vậy tôi khuyên bạn không nên làm theo cách đó.
Robert Bentley

Nếu bạn lo lắng về việc ngừng sử dụng hoặc các thay đổi nội bộ, tôi khuyên bạn nên sử dụng #availablethuộc tính có phần nội dung trống cho bất kỳ phiên bản iOS nào lớn hơn phiên bản hiện tại.
Dan Loewenherz

8

Để loại bỏ phần trên và dưới của đường phân cách cho mỗi phần. Thêm cái này vào ô tĩnh của bạn.

override func layoutSubviews() {
    super.layoutSubviews()

    //Get the width of tableview
    let width = subviews[0].frame.width

    for view in subviews where view != contentView {
        //for top and bottom separator will be same width with the tableview width
        //so we check at here and remove accordingly
        if view.frame.width == width {
            view.removeFromSuperview()
        }
    }
}

Kết quả như hình ảnh bên dưới

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


Câu trả lời hoàn hảo nhưng liệu chúng ta có thể đạt được điều này cho các ô không tùy chỉnh không?
Vishwas Singh

1
Đây là giải pháp duy nhất phù hợp với tôi. Cảm ơn!
Matt

6

Đó là một câu hỏi thực sự cũ, vẫn là một trong những mục đầu tiên trên google khi tìm kiếm cách loại bỏ dấu phân cách trên và dưới cho mỗi phần.

Sau một số cuộc điều tra, tôi phát hiện ra rằng không có cách nào và chỉ là Apple không có ý định làm cho điều này bằng cách nào đó xảy ra mà không có các vụ hack phức tạp một cách ngu ngốc của hệ thống phân cấp chế độ xem.

May mắn thay, có một cách hoàn toàn đơn giản và dễ dàng để đạt được vẻ ngoài như vậy:

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

Tôi nói đơn giản nhưng đối với người mới bắt đầu, điều này có thể khó khăn vì thiếu hiểu biết về cách UITableViewhoạt động và cách triển khai các tế bào của riêng bạn. Hãy để tôi cố gắng giải thích nó:

  1. Tạo một UITableViewCelllớp con
  2. Trong ô của bạn, hãy tạo một thuộc @IBOutlet weak var separatorView: UIView!tính
  3. Trong Bảng phân cảnh của bạn, hãy chọn ô trong chế độ xem bảng và chọn ô của riêng bạn làm lớp sao lưu ô. Lưu ý : Bạn không phải sử dụng kiểu tùy chỉnh. Bạn vẫn có thể sử dụng Cơ bản, Phụ đề, v.v.
  4. Đặt tùy UITableViews Separator Styleđể Noneche giấu các dấu phân cách mặc định
  5. Kéo một UIViewô vào ô của bạn và thay đổi kích thước để ô nằm ở dưới cùng (hoặc trên cùng) của ô. Sử dụng chữ Size Inspectors Autoresizingđể ghim nó vào đầu / cuối / cuối và cung cấp cho nó chiều rộng linh hoạt (hoặc Autolayout nhưng chỉ ở trên cùng trong trường hợp này)
  6. Kết nối chế độ xem với ổ cắm của lớp di động của bạn
  7. Trong UITableViewDataSources của bạn , cellForRowAtIndexPath:hãy đặt thuộc isHiddentính của dấu phân tách tùy chỉnh của bạn dựa trên nếu đó indexPath.rowlà hàng cuối cùng (hoặc đầu tiên, nếu chế độ xem của bạn ở trên cùng) trong phần

Đây là một số mã ví dụ:

class MyCell: UITableViewCell {
    @IBOutlet weak var separatorView: UIView!
}

class ViewController: UITableViewController {


    override func numberOfSections(in tableView: UITableView) -> Int {
        return 3
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! MyCell
        cell.separatorView.isHidden = indexPath.row == 2
        return cell
    }

}

Và đây là một số ảnh chụp màn hình:

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

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

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

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

Vâng, đó là một số công việc nhưng không có cách nào để có một thứ gì đó miễn phí khi viết mã. Cuối cùng, chúng ta là lập trình viên và việc viết mã là tùy thuộc vào chúng ta. Tốt hơn hết là dành 5-10 phút để thiết lập điều này hơn là chỉ sao chép, dán một số mã hack có thể không tiếp tục hoạt động trong tương lai khi Apple quyết định thay đổi hệ thống phân cấp chế độ xem.

Việc viết câu trả lời này thực sự tốn nhiều công sức hơn là thực hiện dấu phân tách. Tôi cũng đã tìm kiếm một giải pháp dễ dàng và nhanh chóng nhưng cuối cùng lại không có một giải pháp đủ tốt mà tôi cảm thấy đáng sử dụng.

Tôi hy vọng bạn cũng cảm thấy nghi ngờ khi bạn thấy các vòng lặp lặp lại trên các lần xem phụ của ô để ẩn hoặc thậm chí xóa các chế độ xem trong thời gian chạy khỏi hệ thống phân cấp chế độ xem mà Apple cung cấp cho bạn, khi có một giải pháp bằng chứng dễ dàng, linh hoạt, ổn định và trong tương lai ngay gần đó . 7 bước nhỏ thực sự là tất cả những gì bạn cần và chúng rất dễ hiểu.


Giải pháp của bạn có hoạt động với chế độ xem phụ kiện hoặc các phụ kiện UITableViewCell tiêu chuẩn (chữ v, nút thông tin, v.v.) không?
IUR

Vì bạn có thể sử dụng các kiểu mặc định và không bị buộc phải sử dụng các kiểu tùy chỉnh, tôi nghĩ rằng việc sử dụng các phụ kiện mặc định sẽ hoạt động mà không có vấn đề gì.
xxtesaxx

Tôi đã thử nó và không thể làm cho dấu phân cách xuất hiện dưới chữ v trong trình tạo giao diện. Tuy nhiên, đã không thử trên thiết bị. Lý do cho nó - xcode chỉ cho phép thêm các chế độ xem vào contentView của ô. Chevron là một phần của chế độ xem phụ kiện, được hiển thị bên cạnh ContentView.
IUR

Trong trường hợp đó, bạn có nhiều lựa chọn. Bạn có thể chỉ cần mở rộng dạng xem dấu phân cách sang bên phải để nó không bị nhìn thấy một phần khi bắt đầu. Khi chế độ xem nội dung sau đó được đẩy sang trái, phần không nhìn thấy trước đó sẽ hiển thị. Không phải yêu thích của tôi nhưng nó hoạt động. Sau đó, bạn có thể sử dụng autolayout kết hợp với một lớp ô bảng xem tùy chỉnh. Ghim biểu tượng riêng xuống dưới cùng và dẫn đầu của chế độ xem nội dung nhưng ở cuối ô. Bằng cách này, ngay cả khi chế độ xem nội dung được ký hợp đồng, dấu phân tách sẽ kéo dài đến hết.
xxtesaxx

3

Đây là những gì cuối cùng tôi đã nghĩ ra:

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

Tôi đã không thể tìm thấy một số cách tốt hơn thế này. Nhưng nó đang làm việc cho tôi rất nhiều. Lần thử cuối với Xcode Phiên bản 7.3.1 (7D1014). Thủ tục này được thực hiện thông qua bảng phân cảnh.

Về cơ bản, tôi thêm một UIView có độ cao 0,5 pt trên UITableViewCell và sau đó đặt màu nền cho UIView đó. Đặt Dấu phân tách của UITableView chính là Không có.

Đây là chi tiết:

Xem xét bạn đã đặt UITableViewCell, tùy chỉnh hoặc mặc định. Ở giai đoạn đầu tiên, đặt dấu phân tách của UITableView là Không có.

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

Tiếp theo, thêm UIView có Chiều cao 1 pt và đặt Nền như bạn cần, trong trường hợp của tôi là màu Đỏ.

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

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

Bắt đầu thiết lập các ràng buộc. Vấn đề là đặt chiều cao của UIView là 0,5 pt. Đây là vấn đề Sự cố duy nhất cho quy trình làm việc này.

UIView với Chiều cao 0,5 pt:

Chia sẻ cách đặt độ cao 0.5 pt của UIView.

Đầu tiên (1) ghim khung nhìn và sau đó (2) đặt chiều cao là 0,5. Bấm phím Enter.

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

Cuối cùng UIView của bạn sẽ giống như sau.

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

Tôi không thể đặt chiều cao là 0,5 ngoài cách này.


2

Đây là giải pháp. Điều này dành cho các ô tĩnh. Nếu bạn muốn động thì chỉ cần viết lại "count". Hy vọng nó giúp.

extension NSObject {
   var theClassName: String {
       return    NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
   }
}

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.separatorStyle = .None
}
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    let count = tableView.numberOfRowsInSection(indexPath.section)
    if ( indexPath.row != count - 1 ) {
        for view in cell.subviews {
            if view.theClassName == "_UITableViewCellSeparatorView" {
                view.backgroundColor = UIColors.redColor()
            }
        }
    }
}

1
Đó trông giống như một giải pháp cực kỳ phức tạp. Nếu bạn có chế độ xem bảng tĩnh, tại sao không đặt dấu phân tách thành không có và thêm một số chế độ xem tùy chỉnh có chiều cao 1p vào các ô tĩnh nơi bạn muốn?
xxtesaxx

Thành thật mà nói, tôi không phải là một fan hâm mộ lớn của tinh chỉnh bên trong khuôn khổ của iOS vì nó có thể được thay đổi sau này. Vì vậy có thể có vấn đề với ứng dụng đã phát hành.
serhat sezer

2

iOS 14, Swift 5

Trong lớp ô tùy chỉnh:

override func layoutSubviews(){
    super.layoutSubviews()
    
    for subview in subviews where (subview != contentView && abs(subview.frame.width - frame.width) <= 0.1 && subview.frame.height < 2) {
        subview.removeFromSuperview()                           //option #1 -- remove the line completely
        //subview.frame = subview.frame.insetBy(dx: 16, dy: 0)  //option #2 -- modify the length
    }
}

Tôi muốn cảm ơn @cook vì giải pháp này, vì tôi đã xây dựng trên nó. Tôi gặp một số vấn đề với giải pháp của họ:

  1. nó đang xóa chế độ xem nền được chọn / đánh dấu mặc định, vì vậy tôi đã thêm một kiểm tra bổ sung về chiều cao của chế độ xem phụ.
  2. Tôi đã đặt mã của mình layoutSubviews()và không gặp sự cố nào.
  3. Tôi đã triển khai một phép gần đúng giữa hai CGFloats thay vì sử dụng toán tử bình đẳng ==, điều này có vẻ dễ xảy ra với tôi.

Tôi đã thêm "tùy chọn số 2" trong mã, vì đó là giải pháp mà cá nhân tôi đang tìm kiếm (Tôi muốn duy trì dấu phân tách, nhưng tôi muốn nó ở cùng mức thụt lề như dấu phân tách ô thông thường, trong trường hợp của tôi là giá trị của 16).


Cuối cùng, tôi nhận được một câu trả lời hiệu quả! Đối với iOS 14, Swift 5.
ChuckZHB

1

Đã thử các giải pháp khác nhau dựa trên cell.separatorInset = UIEdgeInsetsMake()cách giải quyết, không giải pháp nào trong số chúng hoạt động bình thường.

Đối với UITableViewStyleGroupeddự án dựa trên iOS11 của tôi , điều này đã làm được:

self.tableView.separatorColor = self.tableView.backgroundColor;

1

Dựa trên câu trả lời của đầu bếp, nhưng không có hẹn giờ:

override func didAddSubview(_ subview: UIView) {
    super.didAddSubview(subview)
    if NSStringFromClass(subview.classForCoder) != "UITableViewCellContentView" && subview.frame.width == frame.width {
        subview.removeFromSuperview()
    }
}

Chỉ cần thêm điều này vào lớp con của ô và bạn không cần bất kỳ thứ gì khác. Hoạt động trên iOS 12.


0

Tôi gặp sự cố tương tự, trong đó tôi có UITableView được nhóm với các ô tùy chỉnh, tất cả đều được thiết kế với Giao diện xây dựng dưới dạng tệp .xib. Các ô có nền màu trắng, loại bỏ các dấu phân cách mặc định và thêm các ô của riêng tôi. Tôi cũng có Chế độ xem tiêu đề tùy chỉnh cho mỗi phần. Tôi đặt chiều cao của các Chế độ xem tiêu đề đó là 44 (có thể là bất kỳ thứ gì ...). Có một chế độ xem chiều cao 1 điểm giữa các phần của tôi, điều này có vẻ kỳ lạ. Rõ ràng, hệ thống thêm một số chế độ xem nền rõ ràng giữa các phần, ngay cả khi chúng tôi chỉ định chiều cao tùy chỉnh là 44 và Chế độ xem tiêu đề tùy chỉnh mà chúng tôi trả về có màu trắng (hoặc một số màu nền cụ thể). Màu mà chúng ta thấy đằng sau khung nhìn rõ ràng đó là màu nền của Table View thực sự. Trong trường hợp của tôi, cả chế độ xem bảng và các ô phải có màu trắng, và đặt nền của chế độ xem bảng thành màu trắng đã giải quyết được vấn đề (ít nhất là về mặt trực quan, nhưng đó là điều tôi muốn). Giải pháp thứ hai là giữ kiểu của Table View là đơn giản, nhưng triển khai phương thức ủy nhiệm UITableView để trả về 2 hoặc nhiều phần và cũng tạo tiêu đề tùy chỉnh nếu bạn cần. Nhưng điều đó sẽ làm cho các chế độ xem tiêu đề bám vào đầu một thời gian (trong khi cuộn), cho đến khi chế độ xem tiêu đề của phần tiếp theo tiến gần hơn đến nó và sau đó nó cũng bắt đầu đi lên (và đó có thể không phải là điều bạn thực sự muốn, nhưng có có thể là một cách dễ dàng để khắc phục điều đó, mặc dù không chắc chắn).


0

Bạn có thể truy cập chế độ xem bằng

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    let header = view as! UITableViewHeaderFooterView 
    header.backgroundView . .....

0

Hãy thử điều này, nó sẽ loại bỏ dòng phân cách trên cùng.

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath.row == 0 && indexPath.section == 0) {
        for (UIView *view in  cell.subviews) {
            if ([NSStringFromClass([view class]) containsString:@"CellSeparator"]) {
                if (view.frame.origin.y == 0 && CGRectGetHeight(view.frame) < 1.01 ) { //Hide first UITableViewCellSeparatorView
                    NSLog(@"%s Remove View From Cell[Section:0 Row:0] for top border [%@]:%@",__FUNCTION__,NSStringFromClass([view class]),view);
                    view.hidden = YES; //Hide
                }
            }
        }
    }
}


0

iOS 10 ~ 13 chỉ loại bỏ phần đầu dòng chân.

-(void)layoutSubviews{
    [super layoutSubviews];
    //for iOS10~iOS13: only remove section head foot line
    for (UIView * v in self.subviews) {
        if ( v != self.contentView &&
            (v.frame.size.width == self.frame.size.width)){
            [v removeFromSuperview];
        }
    }
}

nếu muốn xóa tất cả dòng:

    for (UIView * v in self.subviews) {
        if (v != self.contentView){
            [v removeFromSuperview];
        }
    }

0
 override func layoutSubviews() {
    super.layoutSubviews()
    subviews.filter { $0 != contentView && $0.frame.width == frame.width }.first?.removeFromSuperview()
}

3
Vui lòng không chỉ đăng mã dưới dạng câu trả lời, mà hãy cung cấp giải thích mã của bạn làm gì và cách nó giải quyết vấn đề của câu hỏi. Các câu trả lời kèm theo lời giải thích thường hữu ích hơn và có chất lượng tốt hơn, đồng thời có nhiều khả năng thu hút sự ủng hộ hơn.
Matt D

-1

Đây là giải pháp Swift hoạt động trên iOS 8 và 9.

Xác định một giao thức với một triển khai mặc định:

protocol CellSeparatorRemovable { }

extension CellSeparatorRemovable {
    func removeSeparatorLinesFromCell(cell: UITableViewCell, section: Int, row: Int, indexPath: NSIndexPath) {
        guard (section, row) == (indexPath.section, indexPath.row) else { return }

        for view in cell.subviews where view != cell.contentView {
            view.removeFromSuperview()
        }
    }
}

Sau đó, bất cứ nơi nào bạn muốn sử dụng nó, hãy tuân theo CellSeparatorRemovablegiao thức và gọi phương thức của nó từ …willDisplayCell…:

class SomeVC: UITableViewController, CellSeparatorRemovable {
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        removeSeparatorLinesFromCell(cell, section: 1, row: 1, indexPath: indexPath)
    }
}

Đây là một giải pháp tối thiểu; bạn có thể cần phải cấu trúc lại nó nếu bạn đang xử lý nhiều ô để tránh các vấn đề đệ quy và / hoặc tái sử dụng ô quá mức.


Xin chào @Aaron Tôi đã thử giải pháp của bạn nhưng dấu phân cách chỉ biến mất sau khi ô được vẽ lại (khi bạn cuộn và nó ra khỏi màn hình và sau đó bạn cuộn lại), nhưng lần đầu tiên màn hình được tải, dấu phân tách vẫn ở đó. Tôi đã thử cell.setNeedsLayout () và cell.setNeedsDisplay (). ANy ý tưởng làm thế nào để giải quyết nó?
PMT

1
Cuối cùng, tôi phải phân loại UITableViewCell và ghi đè layoutSubviews ()
PMT

2
hack hệ thống phân cấp chế độ xem có lẽ không phải là một giải pháp tốt. Nó có thể thay đổi bất cứ lúc nào. Ngoài ra không cần vẽ tùy chỉnh. Xin hãy kiểm tra câu trả lời của tôi về cách giải quyết vấn đề Ops cách tốt hơn
xxtesaxx
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.