Here is my code
import UIKit
class ForwardTextField: UITextField {
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
}
*/
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesBegan(touches, withEvent: event)
self.nextResponder()!.touchesBegan(touches, withEvent: event)
NSLog("Textfield Touches Began")
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesMoved(touches, withEvent: event)
self.nextResponder()!.touchesMoved(touches, withEvent: event)
NSLog("Textfield Touches Moved")
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesEnded(touches, withEvent: event)
self.nextResponder()!.touchesEnded(touches, withEvent: event)
NSLog("Textfield Touches Ended")
}
override func touchesCancelled(
touches: Set<UITouch>?, withEvent event: UIEvent?) {
super.touchesCancelled(touches, withEvent: event)
self.nextResponder()!.touchesCancelled(touches, withEvent: event)
//NSLog(@"Textfield Touches Cancelled");
}
// placeholder position
override func textRectForBounds(bounds: CGRect) -> CGRect {
return CGRectInset(bounds, 10, 10)
}
// text position
override func editingRectForBounds(bounds: CGRect) -> CGRect {
return CGRectInset(bounds, 10, 10)
}
}
I subclass my UITextField
and i was trying to drag around the view but i don't know where i was doing wrong.When first touch it can't be drag but on second touch it jumps to another position and can be draggable.Can anyone help me solved this, it been a while now still stuck on this.I was trying to do something like snapchat textfield which is draggable.
var textField = ForwardTextField()
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("TOUCHES BEGAN\n ")
print("self.textfield == nil = \(self.view.subviews.contains(self.textField))\n")
self.isDrawing = false
if !self.view.subviews.contains(self.textField){
self.textFieldY = 80.0
self.textField = ForwardTextField(frame: CGRectMake(0.0, self.textFieldY, self.view.frame.size.width, 40.0))
self.textField.borderStyle = .None
self.textField.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.4)
//self.textField.alpha = 0.4;
self.textField.textColor = UIColor.whiteColor()
self.textField.returnKeyType = .Done
self.textField.delegate = self
//ADDED
//self.textField.userInteractionEnabled = true
self.textField.multipleTouchEnabled = false
self.textField.exclusiveTouch = false
self.textField.textAlignment = .Center
self.view.addSubview(self.textField)
print("Show Text BOx")
if self.textField.hidden == true {
self.textField.hidden = false
}
self.textField.becomeFirstResponder()
}else {
let touch: UITouch = touches.first!
//NSLog(@"touchesBegan");
let point: CGPoint = touch.locationInView(self.view)
if self.view.subviews.contains(self.textField) && CGRectContainsPoint(self.textField.frame, point) && !self.textField.hidden{
self.isMovingText = true
}
if self.isDrawing {
self.lastPoint = point
}
}
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("TOUCHES MOVED ")
print("ISMOVING TEXT = \(isMovingText)")
if self.isMovingText {
print("MOVESSSS")
let touch: UITouch = touches.first!
var point: CGPoint = touch.locationInView(self.view)
self.textFieldY = point.y
self.textField.frame = CGRectMake(0.0, point.y, self.textField.frame.size.width, self.textField.frame.size.height)
self.view.setNeedsDisplay()
}
if self.isDrawing {
//NSLog(@"touchmoved");
var touch: UITouch = touches.first!
var currentPoint: CGPoint = touch.locationInView(self.view)
self.image.drawAtPoint(CGPointMake(0.0, 0.0))
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), self.lastPoint.x, self.lastPoint.y)
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y)
CGContextSetLineCap(UIGraphicsGetCurrentContext(), .Round)
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush)
CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), self.drawColor.CGColor)
CGContextSetBlendMode(UIGraphicsGetCurrentContext(),.Normal)
CGContextStrokePath(UIGraphicsGetCurrentContext())
self.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.lastPoint = currentPoint
self.view.setNeedsDisplay()
}
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
if self.isMovingText == true {
var touch: UITouch = touches.first!
var point: CGPoint = touch.locationInView(self.view)
self.textFieldY = point.y
self.textField.frame = CGRectMake(0.0, point.y, self.textField.frame.size.width, self.textField.frame.size.height)
self.view.setNeedsDisplay()
self.isMovingText = false
}
if self.isDrawing {
//NSLog(@"touchended");
self.image.drawAtPoint(CGPointMake(0.0, 0.0))
CGContextSetLineCap(UIGraphicsGetCurrentContext(),.Round)
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush)
CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), self.drawColor.CGColor)
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), self.lastPoint.x, self.lastPoint.y)
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), self.lastPoint.x, self.lastPoint.y)
CGContextStrokePath(UIGraphicsGetCurrentContext())
CGContextFlush(UIGraphicsGetCurrentContext())
self.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.view.setNeedsDisplay()
}
}
While nothing is said in the docs about dragging UITextField
This seem like a bad idea (my opinion) as the purpose of a UITextField is to accept user text input, however, I did test successfully dragging a UIView with a UITextField inside the UIView with a UIView parent.
I would delete all of the touches code from your UITextField. Subclass the UIView and add a touchesMoved method to be overriding; inside get the location and use that on the UIView.center.
Worked great for me. Tested both on swift 2.2 and 3.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.