我有一个UIView,上面有4个按钮,另外UIView个在按钮视图的顶部.最上面的视图包含一个UIImageView,上面有一个UITapGestureRecognizer.

我试图创建的行为是,当用户点击UIImageView时,它会在屏幕右下角的小屏幕和动画变大之间切换.当它很大时,我希望底部视图上的按钮被禁用,当它很小时,在右下角,我希望touch 通过按钮,使它们正常工作.我就快到了,但是除非我禁用俯视图的UserInteractions,否则我无法让touch 通过按钮.

在我的initWithFrame:个顶层视图中有这样一个:

// Add a gesture recognizer to the image view
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)];
tapGestureRecognizer.cancelsTouchesInView = NO;
[imageView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];

这是我的百分百方法:

- (void) imageTapped:(UITapGestureRecognizer *) gestureRecognizer {
    // Toggle between expanding and contracting the image
    if (expanded) {
        [self contractAnimated:YES];
        expanded = NO;
        gestureRecognizer.cancelsTouchesInView = NO;
        self.userInteractionEnabled = NO;
        self.exclusiveTouch = NO;
    }
    else {
        [self expandAnimated:YES];
        expanded = YES;
        gestureRecognizer.cancelsTouchesInView = NO;
        self.userInteractionEnabled = YES;
        self.exclusiveTouch = YES;
    }
}

使用上面的代码,当图像较大时,按钮处于非活动状态,当我touch 图像时,图像会缩小,按钮变为活动状态.但是,小图像不会受到影响,因此不会扩展.

如果我在这两种情况下都设置为self.userInteractionEnabled = YES,则图像在touch 时会扩展和收缩,但按钮永远不会接受touch 并表现为禁用状态.

有没有办法让图像在touch 时展开和收缩,但如果图像处于收缩状态,下面的按钮只能接受touch ?我是不是在做傻事,漏掉了什么明显的东西?

我简直要疯了,我想让它发挥作用,这样我们就会感激你的帮助,

戴夫

UPDATE:

为了进一步测试,我覆盖了touchesBegan:touchesCancelled:方法,并在包含UIImageView的视图上调用了它们的超级实现.使用上面的代码,touchesCancelled:永远不会被调用,而touchesBegan:总是被调用.

因此,视图似乎得到了润色,它们只是没有传递到下面的视图.

UPDATE

这是因为响应器链的工作方式吗?我的视图层次 struct 如下所示:

VC - View1
     -View2
      -imageView1 (has tapGestureRecogniser)
      -imageView2
     -View3
      -button1
      -button2

我认为操作系统首先会做一个hittest,因为说View2在前面,所以应该得到所有的touch ,这些永远不会传递给View3,除非View2的userInteraction设置为no,在这种情况下,imageView1也会被阻止接收touch .这是它的工作方式吗?有没有办法让View2通过它对View3的触控?

推荐答案

我认为UIGestureRecognitor是一种误导.最后,为了解决这个问题,我推翻了UIView:中的pointInside:withEvent:方法

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    BOOL pointInside = NO;

    if (CGRectContainsPoint(imageView.frame, point) || expanded) pointInside = YES;

    return pointInside;
}

如果您touch imageView或设置了其展开标志,这会导致视图捕捉所有touch .如果未展开,则仅捕捉位于imageView上的touch .

通过返回NO,顶级VC的视图查询其视图层次 struct 的睡觉以查找匹配.

Ios相关问答推荐

SwiftUI文本编辑器内部滚动填充,无需文本裁剪

如何在iOS中以编程方式推送另一个页面?

SwiftUI Divider过大了其父视图

OnTapGesture在其修改的视图外部触发

当文本为空时,具有垂直轴的SwiftUI文本字段不会与FirstTextBaseline对齐

如何在 Swift 中存储具有关联值的协议?

ionic 4 - 编译 ios - 来自项目Pods的目标GoogleDataTransport中的问题

应用程序被杀死时如何在 flutter ios 应用程序中播放音频?

Apollo iOS 客户端代码生成:错误:无法查询字段

我正在try 制作一种 Select 器样式,例如设置中的外观 Select 器

如何在swiftui中更改可搜索的搜索图标 colored颜色

SwiftUI Select 器值在超过最大值时重置

JSONDecoder 在模拟器上运行良好时无法在真实设备上解码

.overlay 和 body 是什么 swift 概念

在 UICollectionView 上动态设置布局导致莫名其妙的 contentOffset 变化

如何判断 `NSManagedObject` 是否已被删除?

改变 UIView 位置的简单方法?

在 Grand Central Dispatch 中使用 dispatch_sync

NSPredicate 用于测试 NULL 和空白字符串

有什么方法可以加粗 NSString 的一部分?