XLPagerTabStrip 没有填满全宽

Posted

技术标签:

【中文标题】XLPagerTabStrip 没有填满全宽【英文标题】:XLPagerTabStrip doesn't fill full width 【发布时间】: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。

【问题讨论】:

【参考方案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://***.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"
        

    

【讨论】:

以上是关于XLPagerTabStrip 没有填满全宽的主要内容,如果未能解决你的问题,请参考以下文章

操作栏选项卡不填满屏幕宽度

div上的全宽背景颜色

XLPagerTabStrip 选项卡没有获得相等的屏幕宽度:Swift

XLPagerTabStrip 高度条

XLPagerTabStrip:不尊重状态栏

如何在 XLPagerTabStrip swift 中检测滑动或选择事件