Chris
Chris

Reputation: 2274

Position UIButton in UITextview

I would like to place a "forgot?" Button into my Password Textfield. If nothing is in the Textfield the user should be able to click it and another ViewController should pop up. The only thing I managed to do is what you can see in the picture down below. My problem is that the button is not clickable and that it is not on the same level as the placeholder text. Any ideas on how to solve this two problems?

    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

enter image description here

Upvotes: 2

Views: 229

Answers (3)

chirag90
chirag90

Reputation: 2240

In the file you have subclassed from my answer add another function in that file

// 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
}

Now you can remove the follow line

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

Output

Output image

And regarding the button click event. Remove your code as you mention its not connected

IBAction func refresh(_ sender: Any) { }

And add the following code in the same file where the button is created.

@objc func refresh() {
    // your vc code here
    print("in refresh")
}

The above code hooks in with addTarget code you have.

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

Hope this helps.

Upvotes: 1

Nick
Nick

Reputation: 1444

You can use Storyboard. Make a helper view for the password TextField and Forgot Button.

-Set the Helper view same width and height with the email TextField.

-Add a TextField and a Button inside the helper view and then you can decide for the password TextField width and the Forgot Button width. -Set constrains for the TextField and Button

enter image description here

I set green color to understand what the helper View does.

Update

I just used your code and it works fine.Check your textfield constrains again. This is what I used.

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")
    }

The only think I changed is the button type from .custom to .system.

Upvotes: 0

Iman Rosstin
Iman Rosstin

Reputation: 2345

I suggest to create a xib file and its relevant view for text items that have a button inside it. So you would be able to reuse it elsewhere in the future (this or another projects)

By defining constant height (100) you will experience ugly and misplaced UI in different iOS devices. Here it is what you should do :

  1. Define a xib file for your custom UITextView
  2. Create constraints for it so it width and height defined by its parent.Also define your forgot UIButton in relative to your UITextView.
  3. Define its (xib) relevant UIView class
  4. Use it in your Storyboard

Upvotes: 0

Related Questions