重新定位合法标签 ( MKAttributionLabel )
Reposition legal label ( MKAttributionLabel )
我想将法律标签移到右侧。在 iOS 6 和 7 上,下面的解决方案工作正常,但是在 iOS 8.3 上它似乎不起作用。
我得到标签,然后在 viewDidLayoutSubviews
中使用计时器(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;
}
这对旋转等很有效。
但是只要我滚动地图,标签就会跳回到左边。
试过在regionDidChangeAnimated
中调用这个方法,但是标签先左跳右跳,真烦人...
我怎么能强迫那个愚蠢的标签留在右边呢?
Christian 建议的解决方案:
- 子类化 MKMapView
- 将
moveLegalLabel
代码移到那里
- 在
layoutSubviews
中调用
-(void)layoutSubviews
{
[super layoutSubviews];
[self moveLegalLabel];
}
您需要它在 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));
}
像 -viewDidAppear:
、-mapView:regionWillChangeAnimated:
或 -mapView:regionDidChangeAnimated:
这样的挂钩,就像其他人建议的那样,不适合这个目的。
您最好的选择是子类化 MKMapView
并在 -layoutSubviews
after 调用 super
.
中布置您的标签
这里我把它从底部移到了顶部:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
// Move legal notice since covered in design
mapView.subviews
.first { "\(type(of: [=10=]))" == "MKAttributionLabel" }?
.frame.origin.y = mapView.frame.minY + 10
}
要解决此问题,您可以:
1.Create 子类 (MKMapView)
class CustomMapView: MKMapView {
}
2.Override 像这样的布局子视图:
override func layoutSubviews() {
super.layoutSubviews()
let legalLabel: UIView = self.subviews[1]
let frame = .....
}
这种方式适合我
一个Swift4 例子:
正在处理 iOS 11
不需要分类
(基于 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)
}
我想将法律标签移到右侧。在 iOS 6 和 7 上,下面的解决方案工作正常,但是在 iOS 8.3 上它似乎不起作用。
我得到标签,然后在 viewDidLayoutSubviews
中使用计时器(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;
}
这对旋转等很有效。
但是只要我滚动地图,标签就会跳回到左边。
试过在regionDidChangeAnimated
中调用这个方法,但是标签先左跳右跳,真烦人...
我怎么能强迫那个愚蠢的标签留在右边呢?
Christian 建议的解决方案:
- 子类化 MKMapView
- 将
moveLegalLabel
代码移到那里 - 在
layoutSubviews
中调用
-(void)layoutSubviews
{
[super layoutSubviews];
[self moveLegalLabel];
}
您需要它在 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));
}
像 -viewDidAppear:
、-mapView:regionWillChangeAnimated:
或 -mapView:regionDidChangeAnimated:
这样的挂钩,就像其他人建议的那样,不适合这个目的。
您最好的选择是子类化 MKMapView
并在 -layoutSubviews
after 调用 super
.
这里我把它从底部移到了顶部:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
// Move legal notice since covered in design
mapView.subviews
.first { "\(type(of: [=10=]))" == "MKAttributionLabel" }?
.frame.origin.y = mapView.frame.minY + 10
}
要解决此问题,您可以:
1.Create 子类 (MKMapView)
class CustomMapView: MKMapView {
}
2.Override 像这样的布局子视图:
override func layoutSubviews() {
super.layoutSubviews()
let legalLabel: UIView = self.subviews[1]
let frame = .....
}
这种方式适合我
一个Swift4 例子:
正在处理 iOS 11
不需要分类
(基于 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)
}