Ios 在UITextview中定位UIButton

Ios 在UITextview中定位UIButton,ios,swift,uibutton,uitextfield,Ios,Swift,Uibutton,Uitextfield,我想在我的密码文本字段中放置一个“忘记”按钮。如果文本字段中没有任何内容,用户应该能够单击它,并弹出另一个ViewController。我唯一能做的就是你能在下面的图片中看到的。我的问题是按钮不可单击,并且它与占位符文本不在同一级别。有没有办法解决这两个问题 let button = UIButton(type: .custom) button.setTitle("vergessen?", for: .normal) button.frame = CGRect(x: CG

我想在我的密码文本字段中放置一个“忘记”按钮。如果文本字段中没有任何内容,用户应该能够单击它,并弹出另一个ViewController。我唯一能做的就是你能在下面的图片中看到的。我的问题是按钮不可单击,并且它与占位符文本不在同一级别。有没有办法解决这两个问题

    let button = UIButton(type: .custom)
    button.setTitle("vergessen?", for: .normal)
    button.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(100), height: CGFloat(100))
    button.addTarget(self, action: #selector(self.refresh), for: .touchUpInside)
    passwordTextField.rightView = button
    passwordTextField.rightViewMode = .unlessEditing

您可以使用
故事板。为密码
文本字段
和忘记
按钮
创建一个助手视图

-将助手视图设置为与电子邮件
TextField
相同的宽度和高度

-在助手视图中添加一个
TextField
和一个
按钮
,然后您可以决定密码
TextField
宽度和忘记
按钮的宽度。
-为
文本字段
按钮设置约束

我设置了绿色以了解辅助视图的功能

更新

我刚刚使用了你的代码,效果很好。再次检查你的文本字段约束。这是我用过的

override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(type: .system)
        button.setTitle("vergessen?", for: .normal)
        button.setTitleColor(#colorLiteral(red: 0.3647058904, green: 0.06666667014, blue: 0.9686274529, alpha: 1), for: .normal)
        button.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(100), height: CGFloat(100))

        button.addTarget(self, action: #selector(self.refresh), for: .touchUpInside)
        textfFeld.rightView = button
        textfFeld.rightViewMode = .unlessEditing
    }

    @objc func refresh(_ sender: Any) {
        print("Hello")
    }

我唯一的想法是将按钮类型从
.custom
更改为
.system

我建议创建一个
xib
文件及其相关视图,用于包含按钮的文本项。因此,您将来可以在其他地方(本项目或其他项目)重用它

通过定义恒定高度(100),您将在不同的iOS设备中体验到丑陋和错位的UI。 以下是您应该做的:

  • 为自定义
    UITextView
  • 为其创建约束,以便其宽度和高度由其父级定义。还可以定义相对于
    UITextView
    UIButton
  • 定义其(xib)相关的
    UIView
  • 在故事板中使用它

  • 在我的子类文件中,在该文件中添加另一个函数

    // Modify the values as required 
    override func rightViewRect(forBounds bounds: CGRect) -> CGRect {
        let offset = -20
        let width  = 100
        let height = width
        let x = Int(bounds.width) - width - offset
        let y = offset
        let rightViewBounds = CGRect(x: x, y: y, width: width, height: height)
        return rightViewBounds
    }
    
    现在可以删除下面的行

    button.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(100), height: CGFloat(100))
    
    输出

    关于按钮点击事件。删除您提到的未连接代码

    IBAction func refresh(_ sender: Any) { }
    
    并在创建按钮的同一文件中添加以下代码

    @objc func refresh() {
        // your vc code here
        print("in refresh")
    }
    
    上面的代码与您拥有的addTarget代码挂钩

    button.addTarget(self, action: #selector(self.refresh), for: .touchUpInside)
    

    希望这有帮助。

    为函数添加代码
    self。刷新
    您可以使用stackview。我将试着做一个例子。@chirag90我已经有了:IBAction func refresh(uSender:Any){},但它没有连接到任何东西。我必须在哪里调用self.refresh以及如何将iAction连接到按钮?如何更改文本字体和大小?对不起,这是一个新的功能。你所说的助手视图到底是什么意思?@Chris只是为了排列文本字段和按钮。首先放置视图,使其与电子邮件文本字段的尺寸相同,并在该视图中放置密码文本字段和忘记按钮。您是指堆栈视图吗?或者什么“观点”?:D@Chris只是一个普通的UIView。@Chis我刚刚更新了我的答案。检查您的文本字段约束。再次,完美的答案!谢谢您还可以告诉我如何更改按钮的文本大小和字体吗?:DTextsize和字体?是的,您可以执行button.titlelabel.Font=.systemFont(sizeOf:12),对于自定义字体,您可以执行button.titlelabel.Font=UIFont(名称:“OpenSans”,大小:20.0)