【问题标题】:How to change the style of an UIView when it's tapped?点击时如何更改 UIView 的样式?
【发布时间】:2012-06-19 20:48:25
【问题描述】:

我正在使用以下代码制作不同的 UIView 的可点击(它们不是从 UIControl 继承的):

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

但我也想在它们突出显示时更改样式。我该怎么做?

【问题讨论】:

标签: iphone objective-c xcode ios


【解决方案1】:

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

实现 UIView 子类并创建方法,例如选择和取消选择,并为每个方法自定义视图属性。然后只需找到要选择或取消选择的 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;
    }
}

【讨论】:

  • 我试过了,但我无法让它工作......即使点击在目标之外,你也会得到 UIGestureRecognizerStateEnded 所以我不知道我是否应该打开链接。
  • 感谢代码,最后我做了非常相似的事情!
  • 我刚刚意识到,当您使用这种方法点击某些东西时,您无法再在点击时滚动视图...知道如何防止这种情况发生吗?
【解决方案2】:

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

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

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

在这两种情况下,您都可以更改 UIView 属性。您可以在 Apple 的 "Event handling guide" 中找到一些有用的信息。阅读量很大,但只能看“相关示例代码”(TouchesSimpleGestureRecognizers)。

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

【讨论】:

  • 我正在尝试在视图被选中/突出显示时更改其样式,即当您点击它但尚未松开时。我找不到一种简单的方法来检测它.
  • 在这种情况下,我会尝试实现 touchesBegin(但它需要子类化)。顺便说一句,你为什么不使用子类化?您仍然可以像使用常规 UIView 一样将手势识别器添加到子类视图中。只有类名发生变化,并且有几个文件被添加到您的项目中。我不确定,但作为子类化的替代方案,您还可以尝试将一些对象(例如视图控制器)设置为手势识别器的委托并实现 touchesBegin,但我不太确定它是否能正常工作。
  • 我可以使用子类化,但我正在寻找更通用的解决方案,因为我想为多个视图执行此操作。
【解决方案3】:

我设法通过在 UIView 中添加 UIControl 作为子视图来解决这个问题。 UIControl 大小相同,具有透明背景,当它突出显示时会发生变化。像魅力一样工作!

【讨论】:

  • 您能详细说明一下吗?你必须继承 UIControl 吗?你有机会发布你的完整代码吗?谢谢。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2015-09-30
    • 2018-03-24
    • 1970-01-01
    • 2018-12-07
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多