it-swarm.dev

الحصول على موقف UIView فيما يتعلق superview في superview ل

لدي UIView ، حيث قمت بترتيب UIButtons. أريد أن أجد مواقف UIButtons.

أدرك أن buttons.frame سوف تعطيني المواقف ، لكنها لن تعطيني وظائف إلا فيما يتعلق بمراقبتها المباشرة.

هل هناك أي طريقة يمكن أن نجد بها مواقع تلك الأزرار ، فيما يتعلق بتقرير superview في UIButtons؟

على سبيل المثال ، افترض أن هناك UIView المسمى "firstView".

ثم ، لدي UIView آخر ، "viewView". هذا "SecondView" هو عرض فرعي لـ "firstView".

ثم لدي UIButton بمثابة عرض فرعي على "secondView".

->UIViewController.view
--->FirstView A
------->SecondView B
------------>Button

الآن ، هل هناك أي طريقة يمكن أن نجد موقف ذلك UIButton ، فيما يتعلق بـ "العرض الأول"؟

69
Shailesh

يمكنك استخدام هذا:

الهدف- C

CGRect frame = [firstView convertRect:buttons.frame fromView:secondView];

سويفت

let frame = firstView.convert(buttons.frame, from:secondView)

مرجع الوثائق:

https://developer.Apple.com/documentation/uikit/uiview/1622498-convert

155
mprivat

على الرغم من أنه ليس خاصًا بالزر في التسلسل الهرمي كما هو مطلوب ، فقد وجدت ذلك أسهل في التصور والفهم:

من هنا: المصدر الأصلي

 enter image description here 

ObjC:

CGPoint point = [subview1 convertPoint:subview2.frame.Origin toView:viewController.view];

سويفت:

let point = subview1.convert(subview2.frame.Origin, to: viewControll.view)
18
Vlad

تم التحديث لـ Swift 3

    if let frame = yourViewName.superview?.convert(yourViewName.frame, to: nil) {

        print(frame)
    }

 enter image description here 

16
iAj

الإطار: (X ، Y ، العرض ، الارتفاع).

وبالتالي العرض والارتفاع لن يتغير حتى wrt وجهة نظر فائقة فائقة. يمكنك بسهولة الحصول على X ، Y على النحو التالي.

X = button.frame.Origin.x + [button superview].frame.Origin.x;
Y = button.frame.Origin.y + [button superview].frame.Origin.y;
6
iRavi iVooda

يمكنك بسهولة الحصول على عرض super super على النحو التالي.

secondView -> [زر superview]
firstView -> [[superview button] superview]

ثم ، يمكنك الحصول على موقف زر ..

يمكنك استخدام هذا:

xPosition = [[button superview] superview].frame.Origin.x;
yPosition = [[button superview] superview].frame.Origin.y;
2
said altintop

إذا كانت هناك طرق عرض متعددة مكدسة ولا تحتاج (أو تريد) لمعرفة أي طرق عرض محتملة بين طرق العرض التي تهتم بها ، يمكنك القيام بذلك:

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 super viewView الأساسية (أي أن هناك طرق عرض أخرى بين الزر و viewcontroller.view) ، فسيتم استرداد الإحداثيات المحولة وتمريرها إلى superview التالي.
يستمر في فعل نفس الشيء من خلال مجموعة المشاهدات التي تتحرك نحو baseView.
بمجرد أن يصل إلى baseView ، يقوم بتحويل أخير ويعيده.
ملاحظة: لا يتعامل مع الموقف حيث يتم وضع targetView ضمن baseView.

1
Rexb