如何创建自定义uiview,可以在uiview中单击该按钮?

时间:2017-07-28 03:08:12

标签: ios uiview swift3 uibutton

我试图像这样创建点击的滚动视图按钮(在底部): enter image description here

到目前为止,这是我的代码:

scView = UIScrollView(frame: CGRect(x: 0, y: view.frame.maxY-110, width: view.bounds.width, height: 110))
    self.view.addSubview(scView)

    scView.backgroundColor = UIColor.lightGray
    scView.translatesAutoresizingMaskIntoConstraints = false

    for i in 0 ... 10 {
        let myNewView=UIView(frame: CGRect(x: xOffset, y: CGFloat(buttonPadding), width: 200, height: 100))
        myNewView.backgroundColor=UIColor.white
        myNewView.layer.cornerRadius=10
        self.scView.addSubview(myNewView)

        let label = UILabel(frame: CGRect(x: xOffset, y: CGFloat(buttonPadding)+5, width: 150, height: 10))
        label.center = CGPoint(x: 160, y: 285)
        label.textAlignment = .left
        label.text = "I'am a title label"
        label.textColor = .black
        myNewView.addSubview(label)

        let ditancelabel = UILabel(frame: CGRect(x: xOffset, y: CGFloat(buttonPadding)+5, width: 50, height: 10))
        ditancelabel.center = CGPoint(x: 160, y: 285)
        ditancelabel.textAlignment = .right
        ditancelabel.text = "0.04 km"
        ditancelabel.textColor = .red
        myNewView.addSubview(ditancelabel)

        let textView = UITextView(frame: CGRect(x: xOffset, y: CGFloat(buttonPadding)+15, width: 200.0, height: 40.0))
        self.automaticallyAdjustsScrollViewInsets = false
        textView.center = self.view.center
        textView.textAlignment = NSTextAlignment.justified
        textView.textColor = UIColor.lightGray
        textView.backgroundColor = UIColor.clear
        myNewView.addSubview(textView)

        let button = UIButton()
        button.tag = i
        button.backgroundColor = UIColor.white
        button.setTitle("\(i)", for: .normal)
        button.setTitleColor(.black, for: .normal)
        button.backgroundColor = UIColor.clear
        button.addTarget(self, action:#selector(handleRegister(sender:)), for: .touchUpInside)
        button.frame = CGRect(x: xOffset, y: CGFloat(buttonPadding), width: 200, height: 100)
        xOffset = xOffset + CGFloat(buttonPadding) + button.frame.size.width
        myNewView.addSubview(button)
    }

    scView.contentSize = CGSize(width: xOffset, height: scView.frame.height)

但代码结果如下: enter image description here

可以单击第一个按钮,但不能单击另一个按钮。没有出现2个UILabel和1个UITextView。

handleRegister方法是获取发件人标签并将其打印为日志,以便知道该按钮是否可以点击。

如何修复代码,使其与上图中的自定义UIView类似?

我需要通过按钮点击将标签和textview文本传输到另一个视图控制器,该控制器通过handleRegister中的seque处理。

1 个答案:

答案 0 :(得分:0)

1)由于您的容器视图大小为(200,100),您无法看到标签和其他控件

 let myNewView=UIView(frame: CGRect(x: xOffset, y: CGFloat(buttonPadding), width: 200, height: 100))

然后设置控件中心。

label.center = CGPoint(x: 160, y: 285)

ditancelabel.center = CGPoint(x: 160, y: 285)

此中心点在容器视图中不可见。这就是为什么你无法在视图中看到标签的原因。 只需注释这些行即可设置标签中心,您可以完美地看到这些内容。

2)我需要通过按钮点击将标签和文本视图文本传输到另一个视图控制器,该控制器通过handleRegister中的seque处理。

我希望您有一个数组,您可以在其中存储要在自定义视图中显示的数据,只需根据按钮标记从数组中找到该对象,然后将该对象传递给另一个控件。

3)可以单击第一个按钮,但不能单击另一个按钮。

问题与标签相同。你已经设置了这样的按钮框架

button.frame = CGRect(x: xOffset, y: CGFloat(buttonPadding), width: 200, height: 100)

并通过此行增加xOffset以创建另一个视图

xOffset = xOffset + CGFloat(buttonPadding) + button.frame.size.width

xOffset每次都按钮大小增加。因此,如果您打印xOffset值,它实际打印(假设xOffset的初始值= 10,填充= 0)

for i in 0 ... 10 {
print(xOffset)
..... your other code

}

输出:会是这样的 10,210,410,610 ......因此,您的按钮在容器视图中不受限制,因此您无法点击该按钮。

我已更新您的代码,请查看以下

scView = UIScrollView(frame: CGRect(x: 0, y: view.frame.maxY-110, width: view.bounds.width, height: 110))
    self.view.addSubview(scView)

    scView.backgroundColor = UIColor.lightGray
    scView.translatesAutoresizingMaskIntoConstraints = false

    for i in 0 ... 10 {
        let myNewView=UIView(frame: CGRect(x: xOffset, y: CGFloat(buttonPadding), width: 200, height: 100))
        myNewView.backgroundColor=UIColor.white
        myNewView.layer.cornerRadius=10
        self.scView.addSubview(myNewView)

        let subVwOffset = 5

        let label = UILabel(frame: CGRect(x: subVwOffset, y: CGFloat(buttonPadding)+5, width: 150, height: 10))
        label.textAlignment = .left
        label.text = "I'am a title label"
        label.textColor = .black
        myNewView.addSubview(label)

        let ditancelabel = UILabel(frame: CGRect(x: subVwOffset, y: CGFloat(buttonPadding)+5, width: 50, height: 10))
        ditancelabel.textAlignment = .right
        ditancelabel.text = "0.04 km"
        ditancelabel.textColor = .red
        myNewView.addSubview(ditancelabel)

        let textView = UITextView(frame: CGRect(x: subVwOffset, y: CGFloat(buttonPadding)+15, width: 200.0, height: 40.0))
        self.automaticallyAdjustsScrollViewInsets = false
        textView.center = self.view.center
        textView.textAlignment = NSTextAlignment.justified
        textView.textColor = UIColor.lightGray
        textView.backgroundColor = UIColor.clear
        myNewView.addSubview(textView)

        let button = UIButton()
        button.tag = i
        button.backgroundColor = UIColor.white
        button.setTitle("\(i)", for: .normal)
        button.setTitleColor(.black, for: .normal)
        button.backgroundColor = UIColor.clear
        button.addTarget(self, action:#selector(handleRegister(sender:)), for: .touchUpInside)
        button.frame = CGRect(x: subVwOffset, y: CGFloat(buttonPadding), width: 200, height: 100)
        xOffset = xOffset + CGFloat(buttonPadding) + button.frame.size.width
        myNewView.addSubview(button)
    }

    scView.contentSize = CGSize(width: xOffset, height: scView.frame.height)

如果您发现任何其他困难,请告诉我。