繁体   English   中英

MKMapView不响应触摸事件或手势识别器

[英]MKMapView not responding to touch events or gesture recognizers

编辑

发布此问题后,我立即发现错过注释的一行代码。 就是这个... mapViewController.view.translatesAutoresizingMaskIntoConstraints = NO;

我将其注释掉,地图再次正常工作。

您是否知道为什么该行代码会杀死地​​图手势识别器?


我有一个MKMapView,最近几个月运行良好,今天就死了。

我今天做的唯一的事情就是弄乱了代码,就是在viewWillTransitionToSize:withTransitionCoordinator:viewWillLayoutSubviews使用一些定向代码! 我注释掉了我在那里所做的一切,但仍然死了。

它不仅不会响应我自己的手势识别器,也不会响应自己的任何识别器……捏,旋转等。它只是冻结了。

我在地图上方没有任何会阻碍触摸的视图。

我已经控制清理了我的构建文件夹。

我已经关闭了XCode项目,并删除了该项目的派生数据文件夹。

@implementation MapViewController
{
    MKMapView *appleMapView;
}



-(void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    [self addMapViewToSelf];
}


-(void)addMapViewToSelf
{
    // Create and add the apple map view to the side menu view.
    appleMapView = [[MKMapView alloc] initWithFrame:self.view.frame];
    [self.view addSubview:appleMapView];

    appleMapView.delegate = self;

    UILongPressGestureRecognizer *tapRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(windowTapped:)];
    tapRecognizer.minimumPressDuration = 1.0f;
    tapRecognizer.delegate = self;
    [appleMapView addGestureRecognizer:tapRecognizer];
}


-(void)windowTapped:(UIGestureRecognizer *)recognizer
{
    NSLog(@"The recognizer state is '%ld'", (long)recognizer.state);

    if (recognizer.state != UIGestureRecognizerStateBegan) {
        return;
    }

}

当边界改变时,AutoResizingMask是通过UI元素(例如Label)移动的属性。 意味着当方向改变时,应用程序会适应并且不会崩溃。 但是,如果将autoResizingMask设置为Constraint,则告诉它根据autoResizingMask更改约束。 这是每个UI元素的默认行为。 这有助于我们使用诸如self.view.centre或self.view.frame或self.label.size.width等方法快速动态地排列UI元素。

设置translatesAutoresizingMaskIntoConstraints = NO,您实际上正在删除此行为。 因此,您必须提供UI元素固定的坐标,以便无论屏幕的方向如何,UI元素都将停留在该位置。 但是您没有这样做。 因此,UIElement没有约束或固定位置,并且行为正常。

如果您不想随UI的位置或大小动态播放,则不得将其设置为NO。 像基于输入的不断增长的文本字段或一些粗略的动画。

这是苹果试图告诉你的一件事。

当视图的边界发生变化时,该视图会根据每个子视图的自动调整蒙版自动调整其子视图的大小。 您可以通过使用C逐位OR运算符组合UIViewAutoresizing中描述的常量来指定此掩码的值。 结合使用这些常量,您可以指定视图的哪些尺寸应相对于父视图增大或缩小。 此属性的默认值为UIViewAutoresizingNone,它指示不应完全调整视图的大小。

当设置了沿同一轴的多个选项时,默认行为是在柔性部分之间按比例分配大小差异。 相对于其他柔性部分,柔性部分越大,它越可能增长。 例如,假设此属性包含UIViewAutoresizingFlexibleWidth和UIViewAutoresizingFlexibleRightMargin常量,但不包含UIViewAutoresizingFlexibleLeftMargin常量,因此表示该视图的左边缘宽度是固定的,但是该视图的宽度和右边缘可能会改变。 因此,视图看起来锚定在其视图的左侧,而视图宽度和视图右侧的间隙都增加了。

如果自动调整大小行为不能提供所需的精确视图布局,则可以使用自定义容器视图并覆盖其layoutSubviews方法以更精确地定位子视图。

我犯了百万次这样的错误,此博客对此有一个很好的解决方案。

https://www.innoq.com/cn/blog/ios-auto-layout-problem/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM