我想知道是否有人知道您如何在地图视图上移动法律标志,现在我的工具栏正在覆盖它。有谁知道怎么做?谷歌标志有很多帮助,但苹果地图上没有。
11 回答
在斯威夫特:
mapView.layoutMargins = UIEdgeInsetsMake(top, right, -20, left)
我在 OS9 中对此进行了测试,并且可以正常工作。
斯威夫特 5.2
// -20 will make the legal disclaimer move down. If you want the
// disclaimer to move up, use a positive number.
mapView.layoutMargins = UIEdgeInsets(top: 0, left: 0, bottom: -20, right: 0)
这应该可行,虽然我不确定苹果是否会允许你这样做
UILabel *attributionLabel = [mapView.subviews objectAtIndex:1];
attributionLabel.center = CGPointMake(attributionLabel.center.x, attributionLabel.center.y - 44.0f);
这在 iOS 7 中仍然是可能的,但只有 (?) 如果放置在viewDidAppear
. 如果放置在viewDidLoad
或中,坐标将被重置viewWillAppear
。
UILabel *attributionLabel = [mapView.subviews objectAtIndex:1];
attributionLabel.center = CGPointMake(attributionLabel.center.x, attributionLabel.center.y - 44.0f);
这些方法不再适用于 iOS 7。正确的方法是在 UIViewController 上指定 bottomLayoutGuide。这里详细描述
更改位置不太有效,但是隐藏“合法”按钮效果很好。
[[mapView.subviews objectAtIndex:1] setHidden:YES]
编辑:
Swift 2.0 iOS 等效
mapView.subviews[1].isHidden = true
进行双向飞碟点。
我实施了您的方法,它运行良好,但是在多次进入视图控制器之后,法律标签 y 不断减少,因为您看到它总是自行置换的逻辑。所以我建议改为改变中心
我们改变框架
UILabel *attributionLabel = [mapView.subviews objectAtIndex:1];
attributionLabel.frame = CGRectMake(20, self.view.frame.size.height - 135, attributionLabel.frame.size.width, attributionLabel.frame.size.height);
\\135 is height of your bottom view that was hiding legal
我写了对我有用的扩展。它可以在动画块中用于动画这些变化:
import MapKit
extension MKMapView {
/// Workaround for layoutMargins bug.
func setLegalInsets(left: CGFloat, bottom: CGFloat) {
let oldLeft = layoutMargins.left
let oldBottom = layoutMargins.bottom
let lblLegal = (subviews.filter { view in
return view is UILabel
}).first
lblLegal?.frame.origin.x += left - oldLeft
lblLegal?.frame.origin.y -= bottom - oldBottom
layoutMargins.left = left
layoutMargins.bottom = bottom
}
}
@Dymtro 的回答对我来说效果很好,但我建议先检查子视图的大小。如果将来视图层次结构发生变化,这至少应该防止可能的崩溃:
override func viewWillLayoutSubviews() {
positionLegalMapLabel()
}
func positionLegalMapLabel() {
if self.mapView.subviews.count > 1 {
let legalMapLabel = self.mapView.subviews[1]
legalMapLabel.frame.origin = CGPointMake(self.mapView.bounds.size.width - legalMapLabel.frame.size.width - 7, legalMapLabel.frame.origin.y)
}
}
斯威夫特 4+
layoutMargins
您可以通过设置的来更改它们的位置mapView
。
例如,这会将其从底部推开:
mapView.layoutMargins.bottom = -100
您还可以一次更改所有需要的边缘插图:
mapView.layoutMargins = UIEdgeInsets(top: 0, left: 0, bottom: -100, right: 0)
一个基于 @xeieshan 示例的 Swift 3 示例,在针对 iOS 10 SDK 编译时有效。在我的示例中,我在底部有一个透明条,当地图视图出现时它会向上动画。标签重新定位也可以是动画的。
// reposition the 'Legal' label above the transparent bottom bar
// unfortunately there is no safe way to identify the label but it is the last subview - hopefully this will not change
if let legalLabel = mapView.subviews.last {
var frame = legalLabel.frame
frame.origin.y = frame.origin.y - self.bottomBar.bounds.size.height // reposition it above the bottom bar
legalLabel.frame = frame
}
使用 viewWillLayoutSubviews() 而不是 viewDidAppear() 来避免跳转。
override func viewWillLayoutSubviews() {
positionLegalMapLabel()
}
func positionLegalMapLabel() {
let legalMapLabel = self.mapView.subviews[1]
legalMapLabel.frame.origin = CGPointMake(self.mapView.bounds.size.width - legalMapLabel.frame.size.width - 7, legalMapLabel.frame.origin.y)
}