【问题标题】:Creating two textfields with only bottom border swift快速创建两个只有底部边框的文本字段
【发布时间】:2017-07-05 14:17:15
【问题描述】:

我正在尝试创建两个都只有底部边框的 UITextField,我从另一个 StackOverflow 获得了一些代码并且它有效。但是,当我再次为第二个 TextField 复制并粘贴代码时,它只显示一个带有底部边框的 TextField。

代码如下:

 let border = CALayer()
 let width = CGFloat(2.0)
 border.borderColor = UIColor.gray.cgColor
 border.frame = CGRect(x: 0, y: emailText.frame.size.height - 
width, width:  emailText.frame.size.width, height: 
emailText.frame.size.height)

border.frame = CGRect(x: 0, y: passwordText.frame.size.height 
- width, width:  passwordText.frame.size.width, height: 
passwordText.frame.size.height)

    border.borderWidth = width
    passwordText.layer.addSublayer(border)
    passwordText.layer.masksToBounds = true

    border.borderWidth = width
    emailText.layer.addSublayer(border)
    emailText.layer.masksToBounds = true

感谢您的帮助!

【问题讨论】:

  • 您不能对两个文本字段使用相同的 vie。使用第二个边框的副本。完成这项工作的最简单方法是将变量细化为 border2 并对其进行设置和子层化。
  • 您的问题可能是您只创建了border的一个instance,并且不能添加到两个UITextFields. You have a few options - (1) create a second instance of border , subclass UITextField` 并让子类有一个底部边框。子类化可能更“干净”(或更多 OOP),但如果您不希望重用这种文本字段,除非在两个实例中,创建两个实例更容易 - 但将它们命名为 pwBorderemailBorder清晰度。
  • @CalvinChange 它是因为您分配了边框框架,然后再次分配它,因此它会被新的框架大小覆盖。
  • @Gihan 成功了,谢谢

标签: ios swift


【解决方案1】:

CALayers 是基于实例的,这意味着如果您将图层添加到视图中,则无法在不将其从第一个视图中删除的情况下将其添加到新图层。创建两个CALayers 的实例,或者更好的是,创建一个产生所需结果的扩展。

【讨论】:

    【解决方案2】:

    为电子邮件文本字段和用户名文本字段创建单独的边框对象。

    let emailborder = CALayer()
    let passwordborder = CALayer()
    
    let width = CGFloat(2.0)
    emailborder.borderColor = UIColor.gray.cgColor
    emailborder.frame = CGRect(x: 0, y: emailText.frame.size.height - 
    width, width:  emailText.frame.size.width, height: 
    emailText.frame.size.height)
    
    passwordborder.frame = CGRect(x: 0, y: passwordText.frame.size.height 
    - width, width:  passwordText.frame.size.width, height: 
    passwordText.frame.size.height)
    
    passwordborder.borderWidth = width
    passwordText.layer.addSublayer(passwordborder)
    passwordText.layer.masksToBounds = true
    
    emailborder.borderWidth = width
    emailText.layer.addSublayer(emailborder)
    emailText.layer.masksToBounds = true
    

    【讨论】:

      【解决方案3】:

      您不能对两个文本字段使用相同的视图。使用第二个边框的副本。完成这项工作的最简单方法是将变量细化为border2,并对其进行设置和子层化。不要忘记删除您为寄宿生分配的重复框架。

      let border = CALayer()  
      let width = CGFloat(2.0)  
      border.borderColor = UIColor.gray.cgColor  
      border.frame = CGRect(x: 0, y: emailText.frame.size.height -  width, width:  emailText.frame.size.width, height:  emailText.frame.size.height)
      
      let border2 = CALayer() border2.borderColor = border.borderColor border2.frame = border.frame;
      
      border.borderWidth = width
      passwordText.layer.addSublayer(border)
      passwordText.layer.masksToBounds = true
      
      border.borderWidth = width
      emailText.layer.addSublayer(border2)
      emailText.layer.masksToBounds = true
      

      【讨论】:

        【解决方案4】:

        在不编写冗余代码的情况下,您最好的办法是创建一个函数,将您想要设置边界的文本字段作为参数传递,并将样式代码保留在其中,如下所示:

        func setBorder(tf: UITextField) {
        
            let border = CALayer()
            let width = CGFloat(2.0)
        
            border.borderColor = UIColor.gray.cgColor
            border.frame = CGRect(x: 0, y: tf.frame.size.height - width, 
            width:  tf.frame.size.width, height: 
            tf.frame.size.height)
            border.borderWidth = width
        
            tf.layer.addSublayer(border)
            tf.layer.masksToBounds = true
        }   
        

        在viewDidLoad中调用这个函数:

        setBorder(tf: emailText)
        setBorder(tf: passwordText)
        

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 2016-09-24
          • 2014-01-16
          • 1970-01-01
          • 2017-04-15
          • 1970-01-01
          • 1970-01-01
          • 2023-02-21
          • 2015-06-19
          • 2022-11-04
          相关资源
          最近更新 更多