Ios 重新定位合法标签(mkAttributeLabel)
我想把合法标签移到右边。在iOS 6和7上,下面的解决方案运行良好,但在iOS 8.3上似乎不起作用 我获取标签,然后在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
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建议的解决方案:
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)
}