Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 重新定位合法标签(mkAttributeLabel)_Ios_Iphone_Ios8_Mkmapview_Mapkit - Fatal编程技术网

Ios 重新定位合法标签(mkAttributeLabel)

Ios 重新定位合法标签(mkAttributeLabel),ios,iphone,ios8,mkmapview,mapkit,Ios,Iphone,Ios8,Mkmapview,Mapkit,我想把合法标签移到右边。在iOS 6和7上,下面的解决方案运行良好,但在iOS 8.3上似乎不起作用 我获取标签,然后在viewdilayoutsubviews中使用计时器(0.1秒)调用此方法: -(void)moveLegalLabel { UIView * legalLink = [self attributionView]; legalLink.frame = CGRectMake(self.mapView.frame.size.width - legalLink.fra

我想把合法标签移到右边。在iOS 6和7上,下面的解决方案运行良好,但在iOS 8.3上似乎不起作用

我获取标签,然后在
viewdilayoutsubviews
中使用计时器(0.1秒)调用此方法:

-(void)moveLegalLabel
{
    UIView * legalLink = [self attributionView];
    legalLink.frame = CGRectMake(self.mapView.frame.size.width - legalLink.frame.size.width - 10, self.mapView.frame.size.height - legalLink.frame.size.height - 10 , legalLink.frame.size.width, legalLink.frame.size.height);
    legalLink.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
}
它可以很好地用于旋转等。 但只要我滚动地图,标签就会跳回到左边。 试图在
区域IDChangeAnimated
中调用此方法,但标签先向左然后向右跳回,这真的很烦人

我怎么能强迫那个愚蠢的标签站在右边

Christian建议的解决方案:

  • 子类化MKMapView
  • moveLegalLabel
    代码移到此处
  • layoutSubviews
  • -(无效)布局子视图
    {
    [超级布局子视图];
    [自动移动标签];
    
    }

    您需要它出现在ViewDidDisplay和两个MKMapViewDelegate方法中。如果你不把它放在两个委托方法中,你会看到跳跃。就这些

    -(void)viewDidAppear:(BOOL)animated
    {
        [self moveLegalLabel];
    }
    
    - (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
    {
        [self moveLegalLabel];
    }
    - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
    {
        [self moveLegalLabel];
    }
    
    -(void)moveLegalLabel
    {
        UIView * legalLink = [self.map.subviews objectAtIndex:1];
        legalLink.frame = CGRectMake(self.map.frame.size.width - legalLink.frame.size.width - 10, self.map.frame.size.height - legalLink.frame.size.height - 10 , legalLink.frame.size.width, legalLink.frame.size.height);
        legalLink.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
    }
    

    必须在ViewDidDisplay中加载代码,否则代码可能无法生成。显然,您的代码是在视图准备就绪之前编译的

    -(void)moveLegalLabel
    {
        UIView * legalLink = _mapView.subviews[1];
        legalLink.frame = CGRectMake(self.mapView.frame.size.width - legalLink.frame.size.width - 10, self.mapView.frame.size.height - legalLink.frame.size.height - 10 , legalLink.frame.size.width, legalLink.frame.size.height);
        legalLink.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
    }
    
    
    -(void)viewDidAppear:(BOOL)animated {
        [self moveLegalLabel];
    }
    

    如果您创建一个按钮并将代码放入其操作中,当您单击时,您可以看到标签正在移动。

    请尝试使用
    转换

    - (void)moveLegalLabel
    {
        UIView *legalLink = [self attributionView];
        legalLink.transform = CGTransformMakeTranslation(self.mapView.frame.size.width - CGRectGetMaxX(legalLink.frame) - CGRectGetMinX(legalLink.frame), self.mapView.frame.size.height - CGRectGetMaxY(legalLink.frame) - CGRectGetMinY(legalLink.frame));
    }
    
    如果不起作用,尝试使用
    图层。转换

    - (void)moveLegalLabel
    {
        UIView *legalLink = [self attributionView];
        legalLink.layer.transform = CATransform3DMakeTranslation(self.mapView.frame.size.width - CGRectGetMaxX(legalLink.frame) - CGRectGetMinX(legalLink.frame), self.mapView.frame.size.height - CGRectGetMaxY(legalLink.frame) - CGRectGetMinY(legalLink.frame));
    }
    

    像其他建议的钩子一样,诸如
    -viewDidDisplay:
    -mapView:regionWillChangeAnimated:
    -mapView:regionDidChangeAnimated:
    ,不适合此目的


    您最好的选择是在调用
    super
    之后,在
    -layoutSubviews
    子类化
    MKMapView
    并将标签布局在
    -layoutSubviews

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
    
        // Move legal notice since covered in design
        mapView.subviews
            .first { "\(type(of: $0))" == "MKAttributionLabel" }?
            .frame.origin.y = mapView.frame.minY + 10
    }
    

    要解决此问题,您可以:

    1.创建子类(MKMapView)

    2.覆盖如下视图:

    override func layoutSubviews() {
            super.layoutSubviews()
            let legalLabel: UIView = self.subviews[1]
            let frame = .....
        }
    

    这种方法对我来说很有效。

    一个Swift 4示例:

    • 在iOS 11上工作

    • 不需要子类

    (根据埃里克的回答)


    它稍微好一些,但它仍然随机跳跃。。。随着
    regionWillChangeAnimated
    的实现,当我移动地图时,标签确实保持在右侧,这很好。但是在
    regionDidChangeAnimated
    soemtimes工作之后,有时会随机跳回…Hmmm im在iOS 8模拟器上进行测试,并且工作正常。您是否在其他地方重新定位标签?否。。。我甚至在
    viewDidLoad
    中对其进行了评论。你有什么模拟器?8.3?我在所有模拟器和8.3设备上进行了测试,但问题仍然存在。它适用于30%的情况。你到底为什么要延迟0.1秒才这样做?@ChristianSchnorr,因为我需要保留右边的标签,即使在旋转之后。主要的问题是地图在每个区域改变后重新定位标签……那么,在旋转之后(但不延迟!)你如何钩住并撤销地图所做的一切?@ChristianSchnorr这就是我正在做的,但正如我所说的,无论延迟与否,这都很好。问题是当我更改地图的区域(滚动/缩放地图)时,地图会重新定位愚蠢的标签。而
    regionDidChangeAnimated
    中的moveLegalLabel是随机工作的。有时它把标签贴在右边,有时不贴……这是因为你用来定位它的钩子是错的。尝试将地图子类化并覆盖
    -layoutSubviews
    。适用于iOS 13.6
    override func layoutSubviews() {
            super.layoutSubviews()
            let legalLabel: UIView = self.subviews[1]
            let frame = .....
        }
    
    func viewDidAppear(_ animated: Bool) {
       moveLegalLabel()
    }
    
    func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
       moveLegalLabel()
    }
    
    func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
       moveLegalLabel()
    }
    
    func moveLegalLabel() {
       let legalLabel: UIView = mapView.subviews[1]
       legalLabel.frame=CGRect(x: mapView.frame.size.width - (legalLabel.frame.size.width ?? 0.0) - 10, y: mapView.frame.size.height - (legalLabel.frame.size.height ?? 0.0) - 10, width: legalLabel.frame.size.width ?? 0.0, height: legalLabel.frame.size.height ?? 0.0)
    }