UIButtonを配置したUIViewがあります。これらのUIButtonの位置を見つけたいです。
buttons.frame
が私にポジションを与えることは承知していますが、それは私にその即時のスーパービューに関してのみポジションを与えます。
UIButtonsスーパービューのスーパービューに関して、これらのボタンの位置を見つける方法はありますか?
たとえば、「firstView」という名前のUIViewがあるとします。
次に、別のUIView、「secondView」があります。この「SecondView」は「firstView」のサブビューです。
次に、「secondView」のサブビューとしてUIButtonがあります。
->UIViewController.view
--->FirstView A
------->SecondView B
------------>Button
さて、「firstView」に関して、UIButtonの位置を見つける方法はありますか?
これを使用できます:
Objective-C
CGRect frame = [firstView convertRect:buttons.frame fromView:secondView];
Swift
let frame = firstView.convert(buttons.frame, from:secondView)
ドキュメントリファレンス:
https://developer.Apple.com/documentation/uikit/uiview/1622498-convert
階層内のボタンに特定されていませんが、私はこれを視覚化および理解しやすいことがわかりました:
ここから: 元のソース
ObjC:
CGPoint point = [subview1 convertPoint:subview2.frame.Origin toView:viewController.view];
迅速:
let point = subview1.convert(subview2.frame.Origin, to: viewControll.view)
フレーム:(X、Y、width、height)。
したがって、幅と高さは、スーパースーパービューでも変化しません。 X、Yは次のように簡単に取得できます。
X = button.frame.Origin.x + [button superview].frame.Origin.x;
Y = button.frame.Origin.y + [button superview].frame.Origin.y;
複数のビューが積み重ねられていて、関心のあるビュー間で考えられるビューを知る必要がない(または知りたくない)場合、これを行うことができます。
static func getConvertedPoint(_ targetView: UIView, baseView: UIView)->CGPoint{
var pnt = targetView.frame.Origin
if nil == targetView.superview{
return pnt
}
var superView = targetView.superview
while superView != baseView{
pnt = superView!.convert(pnt, to: superView!.superview)
if nil == superView!.superview{
break
}else{
superView = superView!.superview
}
}
return superView!.convert(pnt, to: baseView)
}
targetView
はボタン、baseView
はViewController.view
です。
この関数がしようとしていることは次のとおりです。targetView
にスーパービューがない場合、現在の座標が返されます。targetView's
スーパービューがbaseViewでない場合(つまり、ボタンとviewcontroller.view
の間に他のビューがある場合)、変換された座標が取得され、次のsuperview
に渡されます。
baseViewに向かって移動するビューのスタックを通じて同じことを続けます。baseView
に到達すると、最後の変換を1回行い、それを返します。
注:targetView
がbaseView
の下に配置されている状況は処理しません。
次のように、スーパースーパービューを簡単に取得できます。
secondView-> [ボタンのスーパービュー]
firstView-> [[button superview] superview]
次に、ボタンの位置を取得できます。
これを使用できます:
xPosition = [[button superview] superview].frame.Origin.x;
yPosition = [[button superview] superview].frame.Origin.y;
サブビューのフレームを変換するためのUIView拡張機能(@Rexbの回答に触発)。
extension UIView {
// there can be other views between `subview` and `self`
func getConvertedFrame(fromSubview subview: UIView) -> CGRect? {
// check if `subview` is a subview of self
guard subview.isDescendant(of: self) else {
return nil
}
var frame = subview.frame
if subview.superview == nil {
return frame
}
var superview = subview.superview
while superview != self {
frame = superview!.convert(frame, to: superview!.superview)
if superview!.superview == nil {
break
} else {
superview = superview!.superview
}
}
return superview!.convert(frame, to: self)
}
}
// usage:
let frame = firstView.getConvertedFrame(fromSubview: buttons.frame)