ios - 在不使用 CollectionView 的情况下在 GridView 中列出 UIButton

标签 ios swift gridview uibutton grid

我将有一个方形网格的 UIButton 对象。这些 UIButton 中的每一个都引用了来自数组 API 的唯一选项和 ID。

选项API的例子

options =     (
            {
        name = Color;
        "option_id" = 16;
        "product_option_id" = 1324;
        "product_option_value" =             (
                            {
                image = "example.com/image.jpg";
                name = red;
                "option_value_id" = 104;
                price = 0;
                "price_prefix" = "+";
                "product_option_value_id" = 4650;
            },
                            {
                image = "https://www.ishtari.com/image/cache/data/categories/color/Blue-1125.000000x1125.000000_0.jpg";
                name = blue;
                "option_value_id" = 91;
                price = 0;
                "price_prefix" = "+";
                "product_option_value_id" = 4649;
            }
        );

我正在阅读 API 并在 UIButtons 中列出数组

else if dict["type"].stringValue == "image" {
                        let imageOptionView = UIView(frame: CGRect(x: 5, y: Y, width: self.optionView.frame.size.width - 10, height: 30))
                        imageOptionView.isUserInteractionEnabled = true
                        self.optionView.addSubview(imageOptionView)
                        imageOptionView.tag = i
                        self.imageId.append("")
                        Y += 30;
                        let productOptionArray : JSON = JSON(dict["product_option_value"].arrayObject!)
                        let imagesArray:NSMutableArray = []
                        var internalY:CGFloat = 0
                        for j in 0..<productOptionArray.count {


                            let img = RadioButton(frame: CGRect(x: 5, y: internalY, width: 30, height: 30))

                            let imgName = productOptionArray[j]["name"].stringValue
                            img.setTitle(imgName, for: .normal)
                            img.setTitleColor(UIColor.black, for: .normal)
                            img.titleLabel?.font = UIFont.init(name: REGULARFONT, size: 13.0)


                            let images = productOptionArray[j]["image"].stringValue
                            let data = NSData(contentsOf: NSURL(string: images)! as URL)

                            img.setImage(UIImage(data: data! as Data), for: .normal)
                            img.titleEdgeInsets = UIEdgeInsetsMake(0, 6, 0, 0)
                            img.addTarget(self, action: #selector(self.onRadioButtonValueChangedAccount), for:.touchUpInside)

                            img.tag = j
                            imageOptionView.addSubview(img)
                            internalY += 40;

                            imagesArray.add(img)

            }   
                var paymentInformationContainerFrame = imageOptionView.frame
                    paymentInformationContainerFrame.size.height = internalY
                    imageOptionView.frame = paymentInformationContainerFrame
                    let imgButton:RadioButton = RadioButton()
                    //imgButton.groupButtons = imagesArray as! [RadioButton]

                    Y += internalY;

但是我希望在不使用 CollectionView 的情况下以编程方式将它们列在 GridView 中,这怎么可能?

您可以看到我基于 UIButton 类定义了 RadioButton 类。我正在使用 swift 3

编辑:在论坛的 objective-c 中找到一个解决方案,然后我将其转换为 swift 3 HERE

else if dict["type"].stringValue == "image" {
            let imageOptionView = UIView(frame: CGRect(x: 5, y: Y, width: self.optionView.frame.size.width - 10, height: 30))
            imageOptionView.isUserInteractionEnabled = true
            self.optionView.addSubview(imageOptionView)
            imageOptionView.tag = i
            self.imageId.append("")
            Y += 30;
            let productOptionArray : JSON = JSON(dict["product_option_value"].arrayObject!)
            let imagesArray:NSMutableArray = []
            var internalY:CGFloat = 0

                for j in 0..<productOptionArray.count {
                            var rows: Int = 5
                            var columns: Int = 1
                            for n in 0..<rows {
                                for m in 0..<columns {

                            var frame = CGRect(x: 1 + 45 * n, y: Int(internalY) * m, width: 40, height: 40)

                            var img = RadioButton(frame: frame) as? RadioButton

                            let imgName = productOptionArray[j]["name"].stringValue
                            img?.setTitle(imgName, for: .normal)
                            img?.setTitleColor(UIColor.black, for: .normal)
                            img?.titleLabel?.font = UIFont.init(name: REGULARFONT, size: 13.0)


                            let images = productOptionArray[j]["image"].stringValue
                            let data = NSData(contentsOf: NSURL(string: images)! as URL)
                            img?.setImage(UIImage(data: data! as Data), for: .normal)
                            img?.titleEdgeInsets = UIEdgeInsetsMake(0, 6, 0, 0)
                            img?.addTarget(self, action: #selector(self.onRadioButtonValueChangedAccount), for:.touchUpInside)

                            img?.tag = j + n * columns + m
                            imageOptionView.addSubview(img!)
                            internalY += 40;

                            imagesArray.add(img!)

                        print("images", images)
                        print("imagesArray", imagesArray)
                        }

                            }
                        }

                        var paymentInformationContainerFrame = imageOptionView.frame
                        paymentInformationContainerFrame.size.height = internalY
                        imageOptionView.frame = paymentInformationContainerFrame
                        let imgButton:RadioButton = RadioButton()
                        imgButton.groupButtons = imagesArray as! [RadioButton]

                        Y += internalY;

}

现在我得到了 GridView 中的按钮,但是我没有得到正确的值。例如,它不是显示 3 个 View (对象),而是将 1 个 View (对象)重复 5 次,而其他 View 不显示。加上这个 View 和下一个 View 之间的水平空间(Y),虽然我多次更改 Y 的值但没有工作。

imageArray和images的打印结果

images https://example.com/option-1.jpg
imagesArray (
    "<RadioButton: 0x7fdfafce1b00; baseClass = UIButton; frame = (1 0; 40 40); opaque = NO; layer = <CALayer: 0x60400062c660>>",
    "<RadioButton: 0x7fdfafce2e30; baseClass = UIButton; frame = (46 0; 40 40); opaque = NO; layer = <CALayer: 0x600000629700>>",
    "<RadioButton: 0x7fdfafdc1d00; baseClass = UIButton; frame = (91 0; 40 40); opaque = NO; layer = <CALayer: 0x604000629e20>>",
    "<RadioButton: 0x7fdfafd99910; baseClass = UIButton; frame = (136 0; 40 40); opaque = NO; layer = <CALayer: 0x60400062e2a0>>",
    "<RadioButton: 0x7fdfafcdc960; baseClass = UIButton; frame = (181 0; 40 40); opaque = NO; layer = <CALayer: 0x60000062ff40>>"
)
images https://example.com/option-2.jpg
imagesArray (
    "<RadioButton: 0x7fdfafce1b00; baseClass = UIButton; frame = (1 0; 40 40); opaque = NO; layer = <CALayer: 0x60400062c660>>",
    "<RadioButton: 0x7fdfafce2e30; baseClass = UIButton; frame = (46 0; 40 40); opaque = NO; layer = <CALayer: 0x600000629700>>",
    "<RadioButton: 0x7fdfafdc1d00; baseClass = UIButton; frame = (91 0; 40 40); opaque = NO; layer = <CALayer: 0x604000629e20>>",
    "<RadioButton: 0x7fdfafd99910; baseClass = UIButton; frame = (136 0; 40 40); opaque = NO; layer = <CALayer: 0x60400062e2a0>>",
    "<RadioButton: 0x7fdfafcdc960; baseClass = UIButton; frame = (181 0; 40 40); opaque = NO; layer = <CALayer: 0x60000062ff40>>",
    "<RadioButton: 0x7fdfafdccc30; baseClass = UIButton; frame = (1 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400063e8a0>>"
)
images https://example.com/option-2.jpg
imagesArray (
    "<RadioButton: 0x7fdfafce1b00; baseClass = UIButton; frame = (1 0; 40 40); opaque = NO; layer = <CALayer: 0x60400062c660>>",
    "<RadioButton: 0x7fdfafce2e30; baseClass = UIButton; frame = (46 0; 40 40); opaque = NO; layer = <CALayer: 0x600000629700>>",
    "<RadioButton: 0x7fdfafdc1d00; baseClass = UIButton; frame = (91 0; 40 40); opaque = NO; layer = <CALayer: 0x604000629e20>>",
    "<RadioButton: 0x7fdfafd99910; baseClass = UIButton; frame = (136 0; 40 40); opaque = NO; layer = <CALayer: 0x60400062e2a0>>",
    "<RadioButton: 0x7fdfafcdc960; baseClass = UIButton; frame = (181 0; 40 40); opaque = NO; layer = <CALayer: 0x60000062ff40>>",
    "<RadioButton: 0x7fdfafdccc30; baseClass = UIButton; frame = (1 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400063e8a0>>",
    "<RadioButton: 0x7fdfafde4430; baseClass = UIButton; frame = (46 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400063bd00>>"
)
images https://example.com/option-2.jpg
imagesArray (
    "<RadioButton: 0x7fdfafce1b00; baseClass = UIButton; frame = (1 0; 40 40); opaque = NO; layer = <CALayer: 0x60400062c660>>",
    "<RadioButton: 0x7fdfafce2e30; baseClass = UIButton; frame = (46 0; 40 40); opaque = NO; layer = <CALayer: 0x600000629700>>",
    "<RadioButton: 0x7fdfafdc1d00; baseClass = UIButton; frame = (91 0; 40 40); opaque = NO; layer = <CALayer: 0x604000629e20>>",
    "<RadioButton: 0x7fdfafd99910; baseClass = UIButton; frame = (136 0; 40 40); opaque = NO; layer = <CALayer: 0x60400062e2a0>>",
    "<RadioButton: 0x7fdfafcdc960; baseClass = UIButton; frame = (181 0; 40 40); opaque = NO; layer = <CALayer: 0x60000062ff40>>",
    "<RadioButton: 0x7fdfafdccc30; baseClass = UIButton; frame = (1 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400063e8a0>>",
    "<RadioButton: 0x7fdfafde4430; baseClass = UIButton; frame = (46 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400063bd00>>",
    "<RadioButton: 0x7fdfafde6200; baseClass = UIButton; frame = (91 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400062b620>>"
)
images https://example.com/option-2.jpg
imagesArray (
    "<RadioButton: 0x7fdfafce1b00; baseClass = UIButton; frame = (1 0; 40 40); opaque = NO; layer = <CALayer: 0x60400062c660>>",
    "<RadioButton: 0x7fdfafce2e30; baseClass = UIButton; frame = (46 0; 40 40); opaque = NO; layer = <CALayer: 0x600000629700>>",
    "<RadioButton: 0x7fdfafdc1d00; baseClass = UIButton; frame = (91 0; 40 40); opaque = NO; layer = <CALayer: 0x604000629e20>>",
    "<RadioButton: 0x7fdfafd99910; baseClass = UIButton; frame = (136 0; 40 40); opaque = NO; layer = <CALayer: 0x60400062e2a0>>",
    "<RadioButton: 0x7fdfafcdc960; baseClass = UIButton; frame = (181 0; 40 40); opaque = NO; layer = <CALayer: 0x60000062ff40>>",
    "<RadioButton: 0x7fdfafdccc30; baseClass = UIButton; frame = (1 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400063e8a0>>",
    "<RadioButton: 0x7fdfafde4430; baseClass = UIButton; frame = (46 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400063bd00>>",
    "<RadioButton: 0x7fdfafde6200; baseClass = UIButton; frame = (91 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400062b620>>",
    "<RadioButton: 0x7fdfafde8320; baseClass = UIButton; frame = (136 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400063c400>>"
)
images https://example.com/option-2.jpg
imagesArray (
    "<RadioButton: 0x7fdfafce1b00; baseClass = UIButton; frame = (1 0; 40 40); opaque = NO; layer = <CALayer: 0x60400062c660>>",
    "<RadioButton: 0x7fdfafce2e30; baseClass = UIButton; frame = (46 0; 40 40); opaque = NO; layer = <CALayer: 0x600000629700>>",
    "<RadioButton: 0x7fdfafdc1d00; baseClass = UIButton; frame = (91 0; 40 40); opaque = NO; layer = <CALayer: 0x604000629e20>>",
    "<RadioButton: 0x7fdfafd99910; baseClass = UIButton; frame = (136 0; 40 40); opaque = NO; layer = <CALayer: 0x60400062e2a0>>",
    "<RadioButton: 0x7fdfafcdc960; baseClass = UIButton; frame = (181 0; 40 40); opaque = NO; layer = <CALayer: 0x60000062ff40>>",
    "<RadioButton: 0x7fdfafdccc30; baseClass = UIButton; frame = (1 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400063e8a0>>",
    "<RadioButton: 0x7fdfafde4430; baseClass = UIButton; frame = (46 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400063bd00>>",
    "<RadioButton: 0x7fdfafde6200; baseClass = UIButton; frame = (91 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400062b620>>",
    "<RadioButton: 0x7fdfafde8320; baseClass = UIButton; frame = (136 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400063c400>>",
    "<RadioButton: 0x7fdfafdea760; baseClass = UIButton; frame = (181 0; 40 40); opaque = NO; tag = 1; layer = <CALayer: 0x60400062f760>>"
)

最佳答案

如果您不想使用 Collection View ,您可以使用包含多个水平堆栈 View 的垂直堆栈 View ,或者您可以使用 ScrollView (如果您希望它们可滚动)或包含 UIView 和自定义布局代码。

请注意,可以使用将每个 View 的中心位置设置为其容器 View 的宽度/高度的一部分的约束来均匀地间隔固定数量的 View

对于 x 位置,您可以将水平中心约束设置为:

center = (width / (number_of_views + 1) * (view_index + 1)

所以如果有 3 个 View ,第一个 View ( View 0)的水平中心将是:

center = (width/4) * (0 + 1)

center = width/4

因此,您可以使最左侧 View 的中心位置相对于父 View 的宽度乘以 0.25。将相同的公式应用于网格中的所有 View ,即 x 和 y 维度。

关于ios - 在不使用 CollectionView 的情况下在 GridView 中列出 UIButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52170401/

相关文章:

ios - 我始终从应用程序内保持登录 Facebook

ios - Swift - Grand Central Dispatch 与 block /闭包

iphone - 当我在多任务栏(iPhone)中退出时,程序收到信号 SIGKILL 异常出现

ios - 将元素附加到数组

c# - 如何从数据集中获取数据到 gridview?

ios - 填充 NSString 在 UITableViewCell 中不起作用

swift - 获取用 Swift 拍摄的最后一张照片

swift - swift 2 中的错误 URL

flutter - 在显示图像的gridview上添加手势检测器的位置

c# - 如何在 Gridview 中获取一列复选框?