【问题标题】:Using Visual Format Language with iCarousel in Swift在 Swift 中使用带有 iCarousel 的视觉格式语言
【发布时间】:2017-07-03 07:10:15
【问题描述】:

我喜欢在我的快速项目中使用 iCarousel,但有一件事我无法克服;我想在我的项目中使用可视化语言来布局视图,但是每当我为 iCarousel 使用可视化格式时,它都不起作用。

我注意到问题出在TopMenuCarousel.translatesAutoresizingMaskIntoConstraints=false 属性上。

每当我禁用此属性时,我的 iCarousel 视觉格式约束都会被禁用,并且每当我启用它时,约束都可以正常工作,但我的 iCarousel 不会滚动并始终保持静止。

当前代码:

#
import UIKit
import iCarousel

class Step2_HomePage: UIViewController,iCarouselDelegate,iCarouselDataSource     {


let TopMenuCarouselCount = 5

    var TopMenuCarousel = iCarousel()

override func viewDidLoad() {
    super.viewDidLoad()

    print("Step2HomePage icinde")



    TopMenuCarousel = iCarousel(frame: CGRect())
    view.addSubview(TopMenuCarousel)
  //  TopMenuCarousel.clipsToBounds = true
    TopMenuCarousel.type = .Linear
    TopMenuCarousel.dataSource = self
    TopMenuCarousel.delegate = self






 let views = [ "TopMenuCarousel": TopMenuCarousel  ]

    // 2
    var allConstraints = [NSLayoutConstraint]()



    let TopMenuCarouselTop = NSLayoutConstraint.constraintsWithVisualFormat(
        "V:|-100-[TopMenuCarousel]",
        options: [],
        metrics: nil,
        views: views)
    allConstraints += TopMenuCarouselTop

    let TopMenuCarouselHorizontal = NSLayoutConstraint.constraintsWithVisualFormat(
        "H:|-0-[TopMenuCarousel]-0-|",
        options: [],
        metrics: nil,
        views: views)
    allConstraints += TopMenuCarouselHorizontal



    TopMenuCarousel.translatesAutoresizingMaskIntoConstraints=false
    NSLayoutConstraint.activateConstraints(allConstraints)




    // Do any additional setup after loading the view, typically from a nib.
}

func numberOfItemsInCarousel(carousel: iCarousel) -> Int {
    print("carousel number")
    return TopMenuCarouselCount

}

func carousel(carousel: iCarousel, viewForItemAtIndex index: Int, reusingView view: UIView?) -> UIView {
    print("carousel view icinde")
    let tempView = UIView(frame: CGRect(x: 0, y: 0 , width: 20, height: 20))

    tempView.backgroundColor = UIColor.blueColor()
    return tempView
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}
#

【问题讨论】:

    标签: ios swift xcode autolayout icarousel


    【解决方案1】:

    看起来您没有为 iCarousel 对象设置任何高度。尝试将您的第一个约束更改为:

    let TopMenuCarouselTop = NSLayoutConstraint.constraintsWithVisualFormat(
        "V:|-100-[TopMenuCarousel(20)]",
        options: [],
        metrics: nil,
        views: views)
    

    这是原始代码的完整修改版本。我放大了视图(您的视图是 20x20),并添加了一些颜色以便更容易看到正在发生的事情。

    import UIKit
    import iCarousel
    
    class Step2_HomePage: UIViewController,iCarouselDelegate,iCarouselDataSource {
    
        // array of colors to make it easy to see the individual Carousel views
        let arrayOfColors = [ UIColor.blueColor(), UIColor.redColor(), UIColor.yellowColor(), UIColor.orangeColor(), UIColor.greenColor()]
    
        let TopMenuCarouselCount = 5
    
        var TopMenuCarousel = iCarousel()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            print("Step2HomePage icinde")
    
            self.view.backgroundColor = UIColor.lightGrayColor()
    
            // initialize the TopMenuCarousel object
            TopMenuCarousel = iCarousel(frame: CGRect())
    
            // add TopMenuCarousel to the view
            view.addSubview(TopMenuCarousel)
    
            // if clipsToBounds == true, TopMenuCarousel subviews will be clipped to the TopMenuCarousel frame
            // default is false
    
            //      TopMenuCarousel.clipsToBounds = true
    
            TopMenuCarousel.type = .Linear
            TopMenuCarousel.dataSource = self
            TopMenuCarousel.delegate = self
    
            TopMenuCarousel.backgroundColor = UIColor.purpleColor()
    
            let views = [ "TopMenuCarousel": TopMenuCarousel  ]
    
            var allConstraints = [NSLayoutConstraint]()
    
            // position TopMenuCarousel 100 from the Top, with a Height of 200
            let TopMenuCarouselTop = NSLayoutConstraint.constraintsWithVisualFormat(
                "V:|-100-[TopMenuCarousel(200)]",
                options: [],
                metrics: nil,
                views: views)
    
            allConstraints += TopMenuCarouselTop
    
            // set TopMenuCarousel to stretch the full Width of the view
            let TopMenuCarouselHorizontal = NSLayoutConstraint.constraintsWithVisualFormat(
                "H:|-0-[TopMenuCarousel]-0-|",
                options: [],
                metrics: nil,
                views: views)
    
            allConstraints += TopMenuCarouselHorizontal
    
            // this property *must* be set to false
            TopMenuCarousel.translatesAutoresizingMaskIntoConstraints=false
    
            NSLayoutConstraint.activateConstraints(allConstraints)
    
        }
    
        func numberOfItemsInCarousel(carousel: iCarousel) -> Int {
            print("carousel number \(TopMenuCarouselCount)")
            return TopMenuCarouselCount
        }
    
        func carousel(carousel: iCarousel, viewForItemAtIndex index: Int, reusingView view: UIView?) -> UIView {
            print("carousel view icinde", index)
    
            // create a 200 x 160 view to add to TopMenuCarousel
            let tempView = UIView(frame: CGRect(x: 0, y: 0 , width: 200, height: 160))
    
            // give it one of the colors
            tempView.backgroundColor =  arrayOfColors[index % arrayOfColors.count]
    
            return tempView
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    
    }
    

    【讨论】:

    • 大家好,不幸的是它没有工作:(我按照你的建议做了,但是这一次,iCarousel 视图没有在 constint 中声明的垂直高度。视图出现在最左边屏幕角落与我们的任何“垂直”调整。可能是什么原因?顺便说一下,我删除了以下行:TopMenuCarousel.translatesAutoresizingMaskIntoConstraints=false
    • 我编辑了我的答案给你一个完整的例子...TopMenuCarousel.translatesAutoresizingMaskIntoConstraints 必须设置为 false 以使添加的约束起作用。
    【解决方案2】:

    约束已创建并激活但从未添加到视图中,您应该使用:

    view.addConstraints(allConstraints)
    

    之后

    NSLayoutConstraint.activateConstraints(allConstraints)
    

    正如 DonMag 所说,没有高度限制,这意味着如果 iCarousel 视图没有正确的固有尺寸,它将不会显示,您应该像 DonMag 写的示例一样添加显式高度。

    【讨论】:

    • 过去就是这样...来自 Apple 的文档:When developing for iOS 8.0 or later, use the NSLayoutConstraint class’s activateConstraints: method instead of calling the addConstraints: method directly. The activateConstraints: method automatically adds the constraints to the correct views.developer.apple.com/reference/uikit/uiview/…
    • 哇,我不知道。所以唯一的问题应该是你说的高度!
    • 大家好,不幸的是它没有工作:(我按照你的建议做了,但是这一次,iCarousel 视图没有在 constint 中声明的垂直高度。视图出现在最左边屏幕角落与我们的任何“垂直”调整。可能是什么原因?顺便说一下,我删除了以下行:TopMenuCarousel.translatesAutoresizingMaskIntoConstraints=false
    • 您删除了允许分配的约束工作所需的行。取消删除该行。
    • 你是最棒的。非常感谢。它工作:):)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多