【问题标题】:XLPagerTabStrip doesn't fill full widthXLPagerTabStrip 没有填满全宽
【发布时间】:2017-09-25 08:28:39
【问题描述】:

问题

我正在开发一个 IOS 应用程序。 我使用 XLPagerTabStrip 库来创建像在 Android 中一样的选项卡,例如。 YouTube。 一切正常,但我的选项卡有问题。

我有 3 个标签,但它们不会填满整个宽度,而且它们会相互重叠。


父类代码

import UIKit
import XLPagerTabStrip

class InformationsParentView: ButtonBarPagerTabStripViewController {

    let purpleInspireColor = UIColor(red:0.13, green:0.03, blue:0.25, alpha:1.0)

    override func viewDidLoad() {

        super.viewDidLoad()

        settings.style.buttonBarBackgroundColor = .white
        settings.style.buttonBarItemBackgroundColor = .white
        settings.style.selectedBarBackgroundColor = purpleInspireColor
        settings.style.buttonBarItemLeftRightMargin = 0
        settings.style.selectedBarHeight = 2
        settings.style.buttonBarMinimumLineSpacing = 20
        settings.style.buttonBarItemTitleColor = .black
        settings.style.buttonBarItemLeftRightMargin = 0
        settings.style.buttonBarItemsShouldFillAvailiableWidth = true
    }

    override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] {
        let tabWorkers = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sbWorkers")
        let tabPLs = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sbPLs")
        let tabSuperiors = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sbSuperiors")

        return [tabWorkers, tabPLs, tabSuperiors]
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

故事板

场景

场景

属性检查器

尺寸检查器


信息

我找到了解决方案,但它对我不起作用 (Github Issue 256):

settings.style.buttonBarItemsShouldFillAvailableWidth = true 不会为我填充可用的宽度,除非我也指定了 settings.style.buttonBarItemLeftRightMargin = 0

有没有人解决这个问题?

我正在使用 XCode 版本 9、Swift 3 和 IOS 11。

【问题讨论】:

    标签: ios swift xlpagertabstrip


    【解决方案1】:

    在 pod 中打开 ButtonBarPagerTabStripViewController.swift 文件。

    ButtonBarPagerTabStripViewController类定义中,去掉UICollectionViewDelegate协议,实现UICollectionViewDelegateFlowLayout协议。

    所以改源码

    来自

    open class ButtonBarPagerTabStripViewController: 
        PagerTabStripViewController, PagerTabStripDataSource, 
        PagerTabStripIsProgressiveDelegate, UICollectionViewDelegate, 
        UICollectionViewDataSource {
            ...
    }
    

    open class ButtonBarPagerTabStripViewController: 
        PagerTabStripViewController, PagerTabStripDataSource, 
        PagerTabStripIsProgressiveDelegate, UICollectionViewDataSource, 
        UICollectionViewDelegateFlowLayout {
            ...
    }
    

    当我将我的应用程序从 XCode 8.3.3 迁移到 XCode 9 时,我遇到了这个问题。这是 pod 的问题。如果您使用 XCode 8.3.3 进行尝试,您将看不到任何错误。如果你想使用 XCode 9,请执行上述方法。

    【讨论】:

    • 当我将我的应用程序从 XCode 8.3.3 迁移到 XCode 9 时,我遇到了这个问题。这是 pod 的问题。如果您使用 XCode 8.3.3 进行尝试,您将看不到任何错误。如果要使用 XCode 9,请执行上述方法。它对我有用。
    • 感谢您的回答!我会在 2 周内尝试,因为我在假期。
    • 不客气。无论如何,很高兴听到它正在工作。
    【解决方案2】:

    试试这个

        buttonBarView.selectedBar.backgroundColor = #colorLiteral(red: 0.1353600621, green: 0.1353642344, blue: 0.1353619695, alpha: 1)
    
    
        settings.style.buttonBarBackgroundColor =  .white
        settings.style.buttonBarItemBackgroundColor =  .white
    
        settings.style.selectedBarHeight = 2.0
        settings.style.selectedBarBackgroundColor = purpleInspireColor
    
    
        settings.style.buttonBarItemFont = .boldSystemFont(ofSize: 14)
    
        settings.style.buttonBarItemTitleColor = .black
    
        settings.style.buttonBarItemsShouldFillAvailiableWidth = false
    
    
        super.viewDidLoad()
    

    buttonBarItemsShouldFillAvailiableWidth = false 并确保 super.viewDidload() 是代码的结尾,因为我在更改指标信息时遇到了一些问题

    【讨论】:

    • 感谢您的回答,但它并没有解决我的问题。它们不再重叠,但仍然没有填满整个宽度。
    • 您是否为收藏视图指定了全高宽度?
    • 我添加了一个约束:高度。
    【解决方案3】:

    在调用 super.viewDidLoad() 之前,您需要先配置您的设置然后尝试添加 view.layoutIfNeeded( )配置好设置后,如下图:

    override func viewDidLoad() {
        //configure settings first
        configurePagerTabStrip()
    
        super.viewDidLoad()
    
        //then
        self.view.layoutIfNeeded()
    }
    
    func configurePagerTabStrip() {
        settings.style.buttonBarBackgroundColor = .white
        settings.style.buttonBarItemBackgroundColor = .white
        settings.style.selectedBarBackgroundColor = purpleInspireColor
        settings.style.buttonBarItemLeftRightMargin = 0
        settings.style.selectedBarHeight = 2
        settings.style.buttonBarMinimumLineSpacing = 20
        settings.style.buttonBarItemTitleColor = .black
        settings.style.buttonBarItemLeftRightMargin = 0
        settings.style.buttonBarItemsShouldFillAvailiableWidth = true
    }
    

    【讨论】:

      【解决方案4】:

      上述解决方案都不适合我,除了, jcarlos276 的回答。 https://stackoverflow.com/a/61784184/3549781

      虽然它解决了问题,但也有一些副作用,例如在我的情况下,其中一个子视图控制器中有 UITableView 并且它正在引发警告,

      [TableView] 仅警告一次:UITableView 被告知布局其 可见单元格和其他内容,而不在视图层次结构中 (表视图或其超级视图之一尚未添加到 窗户)。这可能会通过强制表视图中的视图来导致错误 在没有准确信息的情况下加载和执行布局(例如表格视图 边界、特征集合、布局边距、安全区域插入等),以及 由于额外的布局也会导致不必要的性能开销 通过。在 UITableViewAlertForLayoutOutsideViewHierarchy 在 调试器并查看导致这种情况发生的原因,因此您可以避免这种情况 如果可能的话完全采取行动,或者推迟到表格视图有 已添加到窗口。表格视图:;层 = ;内容偏移:{0, 0};内容大小:{414, 438}; 调整内容插入:{0, 0, 0, 0};数据源:(null)>

      这是由以下代码引起的,该代码要求视图立即在 func viewDidLoad() 中进行布局

      view.setNeedsLayout()
      view.layoutIfNeeded()
      

      我想出的实际解决方法有些相似。我没有要求整个view 自行布局,而是为ButtonBarView 连接了一个插座并要求它进行布局,

      buttonBarView.setNeedsLayout()
      buttonBarView.layoutIfNeeded()
      

      【讨论】:

        【解决方案5】:

        试试这个,它在生产应用程序中使用,它适用于我

           import UIKit
            import XLPagerTabStrip
        
            class EventsPagerViewController: ButtonBarPagerTabStripViewController {
        
                /// MARK: - Data
        
                var routingModel: RoutingModel?
        
                // MARK: - Lifecycle
        
                override func viewDidLoad() {
                    // change selected bar color
                    settings.style.buttonBarBackgroundColor = .white
                    settings.style.buttonBarItemBackgroundColor = .white
                    settings.style.selectedBarBackgroundColor = ColorManager.mainOrange
                    settings.style.buttonBarItemFont = .boldSystemFont(ofSize: 14)
                    settings.style.selectedBarHeight = 2.0
                    settings.style.buttonBarMinimumLineSpacing = 0
                    settings.style.buttonBarItemTitleColor = .black
                    settings.style.buttonBarItemsShouldFillAvailableWidth = true
                    settings.style.buttonBarLeftContentInset = 0
                    settings.style.buttonBarRightContentInset = 0
        
                    changeCurrentIndexProgressive = { (oldCell: ButtonBarViewCell?, newCell: ButtonBarViewCell?, progressPercentage: CGFloat, changeCurrentIndex: Bool, animated: Bool) -> Void in
                        guard changeCurrentIndex == true else { return }
                        oldCell?.label.textColor = .black
                        newCell?.label.textColor = ColorManager.mainOrange
                    }
        
                    containerView?.isScrollEnabled = true
                    super.viewDidLoad()
                    definesPresentationContext = true
                    setupNavSettings()        
                }
        
                override public func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] {
                    let upcomingVC = EventsUpcomingItchesViewController()
                    upcomingVC.routingModel = routingModel
                    let pastVC = EventsPastItchesViewController()
        
                    // deinit data
                    routingModel = nil 
                    return [upcomingVC, pastVC]
                }
        
        
                private func setupNavSettings() {
                    navigationItem.title = "My Events"
                }
        
            }
        

        【讨论】: