我想将Legal标签移到右侧。在iOS 6和7上,下面的解决方案工作正常,但在iOS 8.3上似乎无法正常工作。
我得到了标签,然后带了一个计时器(0.1秒) viewDidLayoutSubviews
我称之为这种方法:
-(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;
}
适用于旋转等。
但是一旦我滚动地图,标签就会跳回到左边。
试图在这个方法中调用此方法 regionDidChangeAnimated
但是标签首先向左跳,然后向右跳,这真的很烦人......
我怎么能强迫那个愚蠢的标签留在右边?
Christian建议的解决方案:
- 子类MKMapView
- 移动
moveLegalLabel
代码在那里
- 打电话给
layoutSubviews
-(void)layoutSubviews
{
[super layoutSubviews];
[self moveLegalLabel];
}
像钩子一样 -viewDidAppear:
, -mapView:regionWillChangeAnimated:
要么 -mapView:regionDidChangeAnimated:
和其他人一样,不适合这个目的。
你最好的选择是子类 MKMapView
并将您的标签布局 -layoutSubviews
后 调用 super
。
您需要它在viewDidAppear和两个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;
}
您必须在viewDidAppear中加载代码,然后才能执行代码。显然你的代码是在视图准备好之前编译的。
-(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];
}
如果您创建一个按钮并将代码放入其操作中,则单击时可以看到标签移动。
尝试使用 transform
这条路:
- (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));
}
如果没有工作尝试使用 layer.transform
:
- (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));
}
在这里,我将它从底部移到顶部:
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)
class CustomMapView: MKMapView {
}
2.Override layouSubviews像这样:
override func layoutSubviews() {
super.layoutSubviews()
let legalLabel: UIView = self.subviews[1]
let frame = .....
}
这种方式适合我
一个Swift 4的例子:
(根据Erik的回答)
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)
}