@@ -259,6 +259,47 @@ final class STMarkdownTableViewModelCitationTests: XCTestCase {
259259@MainActor
260260final class STMarkdownTableViewCitationTapTests : XCTestCase {
261261
262+ func testCustomHeaderItemsAreVisibleAfterLayout( ) {
263+ let image = self . makeTestIcon ( )
264+ let style = STMarkdownStyle (
265+ font: . systemFont( ofSize: 14 ) ,
266+ textColor: . label,
267+ lineHeight: 18 ,
268+ kern: 0 ,
269+ tableHeaderItems: [
270+ STMarkdownTableHeaderItem ( identifier: " custom-copy " , image: image) { _ in } ,
271+ STMarkdownTableHeaderItem ( identifier: " custom-fullscreen " , image: image) { _ in }
272+ ] ,
273+ tableHeaderButtonWidth: 16
274+ )
275+ let tableView = STMarkdownTableView ( style: style)
276+
277+ tableView. frame = CGRect ( x: 0 , y: 0 , width: 320 , height: 120 )
278+ tableView. layoutIfNeeded ( )
279+
280+ let buttons = self . headerButtons ( in: tableView)
281+ XCTAssertEqual ( buttons. map ( \. accessibilityIdentifier) , [ " custom-copy " , " custom-fullscreen " ] )
282+ XCTAssertTrue ( buttons. allSatisfy { !$0. frame. isEmpty } , " 自定义 headerItems 按钮应有稳定非零布局尺寸 " )
283+ XCTAssertTrue ( buttons. allSatisfy { $0. image ( for: . normal) != nil } , " 自定义 headerItems 按钮应保留配置的图片 " )
284+ }
285+
286+ func testReassigningHeaderItemsRemovesOldButtons( ) {
287+ let image = self . makeTestIcon ( )
288+ let tableView = STMarkdownTableView ( style: . default)
289+ tableView. headerItems = [
290+ STMarkdownTableHeaderItem ( identifier: " first " , image: image) { _ in } ,
291+ STMarkdownTableHeaderItem ( identifier: " second " , image: image) { _ in }
292+ ]
293+ tableView. headerItems = [
294+ STMarkdownTableHeaderItem ( identifier: " third " , image: image) { _ in }
295+ ]
296+
297+ tableView. frame = CGRect ( x: 0 , y: 0 , width: 320 , height: 120 )
298+ tableView. layoutIfNeeded ( )
299+
300+ XCTAssertEqual ( self . headerButtons ( in: tableView) . map ( \. accessibilityIdentifier) , [ " third " ] )
301+ }
302+
262303 func testCitationTapCallbackFiredWhenCellSelected( ) {
263304 let style = STMarkdownStyle . default
264305 let tableView = STMarkdownTableView ( style: style)
@@ -481,4 +522,22 @@ final class STMarkdownTableViewCitationTapTests: XCTestCase {
481522 private func gradientLayer( named name: String , in view: UIView ) -> CAGradientLayer ? {
482523 view. layer. sublayers? . first ( where: { $0. name == name } ) as? CAGradientLayer
483524 }
525+
526+ private func headerButtons( in view: UIView ) -> [ UIButton ] {
527+ view. subviews. flatMap { subview -> [ UIButton ] in
528+ var buttons = self . headerButtons ( in: subview)
529+ if let button = subview as? UIButton {
530+ buttons. insert ( button, at: 0 )
531+ }
532+ return buttons
533+ }
534+ }
535+
536+ private func makeTestIcon( ) -> UIImage {
537+ let renderer = UIGraphicsImageRenderer ( size: CGSize ( width: 16 , height: 16 ) )
538+ return renderer. image { context in
539+ UIColor . black. setFill ( )
540+ context. fill ( CGRect ( x: 3 , y: 3 , width: 10 , height: 10 ) )
541+ }
542+ }
484543}
0 commit comments