如何在点击UIView时改变它的风格?

我正在使用以下代码制作不同的UIView的tappable(它们不是从UIControlinheritance):

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTappedOnLink:)]; [labelView setUserInteractionEnabled:YES]; [labelView addGestureRecognizer:gesture]; 

但是当我们突出显示时,我也想改变它的风格。 我怎么做?

将UILongPressGestureRecognizer而不是UITapGestureRecognizer附加到父视图,并根据自己的喜好设置它的属性。 跟踪和响应选择的方法是以适当的方式实现userTappedOnLink方法。 当手势识别器被激活时,此方法将在很短的时间内被调用,并且您通过跟踪识别器状态知道发生了什么。

实现UIView子类并创建方法,例如select和deselect,并为每个方法自定义视图属性。 然后,只需要找到要选择或取消选择的UIView子类,并且可以使用UIGestureRecognizer方法在父视图中返回点并在检查触摸点是否在特定子视图帧内时迭代它的子视图。

 - (IBAction)userTappedOnLink:(UIGestureRecognizer*)sender { switch (sender.state) { case UIGestureRecognizerStateBegan: { CGPoint touchPoint = [sender locationInView:self.parentView]; for (UIView *subView in [self.parentView subViews) { if (CGRectContainsPoint(subView.frame, tapPoint)) { self.activeSubView = self.subview; break; } } [self.activeSubView select]; case UIGestureRecognizerStateChanged:[self.activeSubView doNothing];; break; case UIGestureRecognizerStateEnded:[self.activeSubView deSelect]; self.activeSubView = nil; break; } } 

在iOS中有两种处理事件的方法。 第一个是使用UIView子类化并覆盖UIView从UIResponder类inheritance的方法 (即touchesBegan:withEvent,touchesMoved:withEvent,touchesEnded:withEvent,touchesCancelled:withEvent)。

第二种方法是创建手势识别器类的新实例并将其添加到您的UIView对象(就像您所做的那样),然后创建一个处理程序。

 - (IBAction)userTappedOnLink:(UIGestureRecognizer *)sender { // Changing view properties. } 

在这两种情况下,您都可以更改UIView属性。 您可以在Apple的“事件处理指南”中找到一些有用的信息。 有很多阅读,但你只能看看“相关的示例代码”( Touches和SimpleGestureRecognizers )。

更改应用程序中界面元素的样式属性的方式取决于这些属性是什么。 有时他们可以动画有时他们不是。 通常,更改视图属性的代码放在touchesBegin函数或手势识别器处理程序中。 MoveMe示例代码显示了如何更改视图属性并为其设置动画。 在“事件处理指南”的手势识别器章节中,框架属性已更改。

我设法通过在UIView中添加UIControl作为子视图来解决这个问题。 UIControl具有相同的大小,具有透明背景,在突出显示时会发生变化。 奇迹般有效!

好吧,我还没有测试过,只是一个建议,请为此视图处理touchesbegin,并调用[labelView addGestureRecognizer:gesture]; function。 也许你应该使用另一个函数, - (void)removeGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer .