Tag: uiresponder

键盘显示时如何引发U​​ITextField

初学者在构建自己的应用程序时,最常遇到的问题之一就是在键盘弹出时提高UIView或其众多子类之一。 有数十个Stack Overflow帖子,每个帖子都有数百条评论,所有这些都试图回答这个简单的问题。 即使对于经验丰富的老手来说,这样做也有点麻木,尤其是对于初学者,可能很难筛选所有可能的答案并自己选择最佳的解决方案。 此外,即使有人选择了某个解决方案,他们也常常无法确切了解引擎盖下发生了什么,或者该解决方案的好坏。 这会阻止人们快速学习,并可能导致他们养成不良习惯。 在这里,我将尝试给出解决方案,其背后的思考过程,并深入解释为什么我要这样做。 让我们开始吧。 在开发您在iOS中不确定的东西时,您的第一反应应该是参考Apple文档。 通常,您会发现大量有用的信息(只要您仔细阅读!)。 我在浏览“ 与键盘相关的通知”部分下的UITextField文档时发现了一些花哨的地方: “因为系统响应响应者的更改来管理键盘的显示和隐藏,所以它会发布以下通知来跟踪与键盘相关的更改” 这些通知是: UIKeyboardWillShow UIKeyboardDidShow UIKeyboardWillHide UIKeyboardDidHide UIKeyboardWillChangeFrame UIKeyboardDidChangeFrame 好的,太好了-因此,这些通知会告诉您键盘何时开始执行操作。 但是我们如何收到这些通知? 在iOS中,我们使用NSNotificationCenter(如果您使用的是Swift,则使用NotificationCenter)在整个应用程序中发送或接收通知。 如果您不太了解iOS中的通知,请稍后再回来查看我的通知博客文章。 在开始研究方面,我们几乎有所需的东西! 我们希望收听这些通知的发布,并在收到通知时可以调整我们的UI,以使一切看起来都很好。 让我们编码。 创建一个新项目(命名为任何名称) 打开情节提要文件,并使用自动布局将UITextField固定到视图控制器的底部。 添加前导约束,以便我们定义x值 添加尾随约束,以便我们定义宽度 添加底部约束,以便我们定义ay值 如果我们现在运行该应用程序并按文本字段,则键盘将显示并覆盖文本字段。 现在让我们修复它。 3.在ViewController.swift中,将以下代码添加到viewDidLoad函数中: NotificationCenter.default.addObserver(自身,选择器:#selector(ViewController.keyboardWillShow),名称:NSNotification.Name.UIKeyboardWillShow,对象:nil)NotificationCenter.default.addObserver(自身,选择器:#selector(ViewController.keyboardWillHide),名称: NSNotification.Name.UIKeyboardWillHide,对象:无) 在这里,我们正在默认的通知中心注册我们的视图控制器,以便可以在显示或隐藏键盘时进行更新。 您会注意到,对于选择器,我使用了文件中尚不存在的函数-现在让我们将它们写出来。 4.将以下函数头添加到ViewController.swift: @objc func keyboardWillShow(通知:NSNotification){} @objc func keyboardWillHide(通知:NSNotification){} 5.现在,我们需要获取键盘更新后的大小信息。 可通过传入的NSNotification参数userInfo对象获得此信息。 userInfo对象是可选的,因此我们需要先对其进行拆包以验证其存在: 守护让userInfo = notification.userInfo else {return} 6.为了获得键盘的大小,我们需要使用键UIKeyboardFrameEndUserInfoKey访问userInfo字典。 […]

将摇动手势事件传递给应用程序委托

我把我的视图控制器中的motionBegan:withEvent:方法,看看它是否会工作,但它没有被调用。 在viewWillAppear ,我将视图控制器作为第一个响应者,并从canBecomeFirstResponder返回YES。 这个视图控制器在分割视图的主窗格中,所以也许第一个响应者在我摇晃设备之前被改变了。 但我真正的问题是如何将所有运动事件传递给我的应用程序委托中的处理程序? 我真的必须有motionBegan:withEvent:方法在所有视图控制器或委托给所有第一响应者? 没有办法像这样的事件stream入响应者链而不插入代码到每个UIResponder? 似乎会有,但我没有把手指在如何做到这一点。

UIResponder和多个UIControlEvents

有没有办法为多个UIControlEvents调用select器? 这不起作用,但它会让你知道我在做什么。 [self.slider addTarget:self action:@selector(sliderDidStopDragging:) forControlEvents:UIControlEventTouchUpInside, UIControlEventTouchUpOutside]; 谢谢!!

确定响应者链是否会处理一个行动

响应者链很酷 。 尤其是,能够将自定义操作发送给第一个响应者,这个操作会冒泡给任何可能感兴趣的人: [[UIApplication sharedApplication] sendAction: @selector(commandToSend) to: nil from: self forEvent: nil] 。 或者更less的自定义操作: [[UIApplication sharedApplication] sendAction: @selector(resignFirstResponder) to: nil from: self forEvent: nil] 我想知道 – 如果现在发送某个特定发件人的特定操作,是否有办法进行testing? 一个明显的用法是启用和禁用发送操作的button,取决于当前是否要处理该操作。 如果你碰巧知道第一个响应者,我想你可以[aResponder targetForAction: @selector(methodYouWantToSend) withSender: selfOrSomethingElse] ,并检查答案是否为零。 但是似乎并没有一个和UIApplication的sendAction:…类似的方法sendAction:…它将自动从第一个响应者开始,并进行处理。

如何将触摸事件发送到Swift中的nextResponder

背景 我试图让一个UICollectionViewCell像一个button(即,做一个animation昏暗的触摸)行为。 我有一个用UIButton填充单元的想法。 然后,button将照顾被窃听的视觉效果。 但是,然后我需要将触摸事件传递给父( UICollectionViewCell ),以便button不只是消耗事件。 这样我可以处理它与集合视图的didSelectItemAtPath 。 下面的问题是我试图找出如何通过事件。 我的问题 我遇到了这个Objective-C的答案传递触摸事件: – (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; [self.nextResponder touchesBegan:touches withEvent:event]; } 不过,当我试图将其转换为Swift时,我陷入了困境: class MyButton: UIButton { override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { super.touchesBegan(touches, withEvent: event) self.nextResponder() // ??? } } nextResponder方法不接受任何参数,那么如何传递触摸事件呢? 我无法使用相关的SO问题( 这里和这里 )来帮助我解决这个问题。

SpriteKit SKScene缺lesstouchesEnded

我注意到touchesEnd并不总是通过多点触摸传送到SKScene。 根据去除手指等的速度,我会永久地错过一些touchesEnded。 touchesCledlled是实现的,我添加了一个自定义的UIView并放在屏幕的左侧 – 没有问题。 我做了一个自定义SKView并捕获事件 – 再次没有问题。 很显然,SKScene并没有得到所有的触摸已经embeddedSKView,但为什么呢? (顺便说一下,我正在运行SKScene完全没有任何节点) 编辑: 一些进一步的调查显示,我可以让SKScene完全失去联系: 我把三个手指放在显示器上,然后一次将它们一个一个的去除,直到只有一个手指触摸。 我移动手指 – >只有SKView收到移动事件,SKScene不收。 它也没有收到touchesEnded。 经过一些实验后,我可以说这是在触碰电话中接触到多次触碰(例如,“同时按两个手指”)时发生的。 这两个接触就会纠缠在一起,所以只有其中一个发送事件。 这似乎是SKScene中的一个错误。 我正在testingiPhone 5

如何将UIApplicationDelegate添加到UIResponder链的末尾?

我试图提供一个IBAction方法,以在应用程序的各个部分所需的常见function。 即login是以模态方式实现的,并且如果它成功导致允许所有加载的视图控制器对该事件作出反应的通知(从匿名到authentication的转换) @interface MyAppDelegate : NSObject <UIApplicationDelegate> { … } – (IBAction)loginTapped:(id)sender; @end 我将该button的动作设置为IB中的First Responder,但响应者链不会给MyAppDelegate一个回应的机会。 我的问题是,我不想在响应链的各个部分复制该方法,我想将其添加到已经是子类的公共类中。 UIResponder链一直到UIApplication但似乎是结束。 我的UIApplicationDelegate没有参与。 我想插入或添加我的应用程序委托给响应者链! (或find另一种方法来连接UIButton touch-up-inside到一个应用程序范围的实现..我想避免如果可能的话UITabBarController或UIWindow )

带有inputAccessoryView的UIViewController不会被释放

我有简单的UIViewController的子类(下面的代码)。 如果我附上inputAccessoryView,我的viewcontroller永远不会被释放。 如果我不在viewDidLoad中设置inputAccessoryView,则按预期方式调用dealloc。 我错过了什么吗? @interface IMTestViewController : UIViewController @property (nonatomic, strong) UIView *messageInputView; @property(nonatomic, readwrite, strong) UIView *inputAccessoryView; @end @implementation IMTestViewController – (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } – (void)dealloc { } – (void)viewDidLoad { [super viewDidLoad]; self.inputAccessoryView = self.messageInputView; } […]

传递触摸事件到适当的兄弟UIViews

我试图处理触摸事件touchesBegan覆盖到父UIView但也允许触摸input传递到兄弟UIView底下。 我预计会有一些直接的方式来处理触摸事件,然后说“现在发送给下一个响应者,就好像这个不存在”,但我能find的是下一个nextResponder方法,它似乎是给将父项返回到覆盖视图。 那父母是不是真的把它传递到覆盖视图的下一个兄弟,所以我卡住不确定如何做什么似乎是一个简单的任务,通常是通过触摸callback获得一个真或假返回值来告诉它是否继续处理小部件层次结构。 我错过了什么明显的?

iPhone:在透明的UIScrollView后面点击view

我有一个UIScrollView被设置为具有清晰的背景。 部分scrollview有内容,但部分不(因此它显示其他视图)。 我希望能够点击UIScrollView和后面的MKMapView,但只能用于UIScrollView的透明部分。 我发现了一些代码,我真的很难理解如何工作: – (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (![self yourMethodThatDeterminesInterestingTouches:touches withEvent:event]) [self.nextResponder touchesBegan:touches withEvent:event]; } 有人能帮我把我的想法包括在如何将一个触摸事件转发到另一个视图背后的视图吗? 我可以调用 – (void)touchesBegan:(NSSet *)从UIViewController触及事件:(UIEvent *)事件?