XLPagerTabStrip未填满全宽

时间:2017-09-25 08:28:40

标签: ios swift xlpagertabstrip

问题

我正在开发IOS应用程序。 我使用XLPagerTabStrip库来创建像Android一样的标签。 YouTube上。 一切正常,但我对标签有问题。

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

3 Tabs with the Problem

Paren-Class Code

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.
    }

}

故事板

Scene

场景

Scene

场景

Attributes Inspector

属性检查器

Size Inspector

尺寸检验员

的相关信息

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

  除非我同时指定了settings.style.buttonBarItemsShouldFillAvailableWidth = true,否则

settings.style.buttonBarItemLeftRightMargin = 0不会为我填充可用的宽度。

有没有人可以解决这个问题?

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

5 个答案:

答案 0 :(得分:6)

在窗格中打开 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,请执行上述方法。

答案 1 :(得分:1)

试试这个

    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()是代码的结尾,因为我在更改指标信息时遇到了一些问题

答案 2 :(得分:1)

在调用 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
}

答案 3 :(得分:1)

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

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

<块引用>

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

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

view.setNeedsLayout()
view.layoutIfNeeded()

我想出的实际修复有点相似。我没有要求整个 view 自己进行布局,而是为 ButtonBarView 连接了一个插座并要求它进行布局,

buttonBarView.setNeedsLayout()
buttonBarView.layoutIfNeeded()

答案 4 :(得分:0)

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

   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"
        }

    }