তার তত্ত্বাবধানের তদারকির জন্য সম্মতভাবে ইউআইভিউয়ের অবস্থান পান


99

আমার একটি ইউআইভিউ রয়েছে, যেখানে আমি ইউআইব্লটনগুলি সাজিয়েছি। আমি সেই ইউআইবাটনগুলির অবস্থানগুলি খুঁজতে চাই।

আমি সচেতন যে buttons.frameআমাকে পজিশনগুলি দেবে, তবে এটি কেবল তাত্ক্ষণিক তদারকির জন্য সম্মানের সাথে আমাকে অবস্থান দেবে।

UIButtons তত্ত্বাবধানের তত্ত্বাবধানে শ্রদ্ধার সাথে আমরা কীভাবে এই বোতামগুলির অবস্থানগুলি খুঁজে পেতে পারি?

উদাহরণস্বরূপ, ধরুন এখানে "ফার্স্টভিউ" নামে ইউআইভিউ রয়েছে।

তারপরে, আমার আর একটি ইউআইভিউ রয়েছে, "সেকেন্ডভিউ"। এই "সেকেন্ডভিউ "টি" ফার্স্টভিউ "এর একটি সংক্ষিপ্তসার।

তারপরে আমার কাছে "সেকেন্ডভিউ" তে সাবভিউ হিসাবে ইউআইবাটন আছে।

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

এখন, "ফার্স্টভিউ" এর প্রতি শ্রদ্ধা রেখে আমরা সেই ইউআইবাটনটির অবস্থান খুঁজে পাওয়ার কোনও উপায় আছে কি?

উত্তর:


197

আপনি এটি ব্যবহার করতে পারেন:

উদ্দেশ্য গ

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

সুইফট

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

ডকুমেন্টেশন রেফারেন্স:

https://developer.apple.com/docamentation/uikit/uiview/1622498- রূপান্তর


এটি যুক্ত করার জন্য, যদি আপনার দৃষ্টিভঙ্গি সবসময় একই দৃষ্টিতে না থাকে (বলুন, আপনি যদি এটি কোনও ফাংশনে ব্যবহার করেন) তবে আপনি '... থেকে ভিউ: [বোতাম তত্ত্বাবধান]] রাখতে পারেন;'
মাইলগন

42

যদিও অনুক্রমের বোতামটির সাথে সুনির্দিষ্ট না হলেও জিজ্ঞাসা করা হয়েছে আমি এটি কল্পনা করা এবং বুঝতে সহজ পেয়েছি:

এখান থেকে: আসল উত্স

এখানে চিত্র বর্ণনা লিখুন

ওবিজেসি:

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

দ্রুত:

let point = subview1.convert(subview2.frame.origin, to: viewControll.view)

21

সুইফট 3-এর জন্য আপডেট হয়েছে

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

        print(frame)
    }

এখানে চিত্র বর্ণনা লিখুন


7

ফ্রেম: (এক্স, ওয়াই, প্রস্থ, উচ্চতা)।

অতএব প্রস্থ এবং উচ্চতা এমনকি সুপার-সুপার ভিউটি পরিবর্তন করে না। নিম্নলিখিত হিসাবে আপনি সহজেই এক্স, ওয়াই পেতে পারেন।

X = button.frame.origin.x + [button superview].frame.origin.x;
Y = button.frame.origin.y + [button superview].frame.origin.y;

তবে কেন আমি এত বেশি পরিমাণে এক্স, ওয়াইয়ের মান পাচ্ছি, যখন আমার এক্স 0,0 ছিল তখন আমি আপনার কোডের লাইনগুলি পেয়ে যাচ্ছি; 180224 নাকি?

5

যদি সেখানে একাধিক মতামত স্তুপীকৃত থাকে এবং আপনার আগ্রহী মতামতের মধ্যে কোনও সম্ভাব্য মতামত জানতে আপনার প্রয়োজন (বা চান না), আপনি এটি করতে পারেন:

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সুপার ভিউ বেসভিউ না হয় (যেমন বোতাম এবং এর মধ্যে অন্যান্য মতামত রয়েছে viewcontroller.view), একটি রূপান্তরিত স্থানাঙ্কটি পুনরুদ্ধার করা হবে এবং পরবর্তীটিতে প্রেরণ করা হবে superview
বেসভিউয়ের দিকে এগিয়ে যাওয়া ভিউয়ের স্ট্যাকের মাধ্যমে এটি একই কাজ করে চলেছে।
এটি একবারে পৌঁছে গেলে এটি baseViewএকটি শেষ রূপান্তর করে এবং তা ফেরত দেয়।
দ্রষ্টব্য: এটি এমন পরিস্থিতিতে পরিচালনা করে না যেখানে targetViewঅধীনে অবস্থিত baseView


4

সাবভিউর ফ্রেম রূপান্তর করার জন্য ইউআইভিউ এক্সটেনশন (@ রেক্সব উত্তর দ্বারা অনুপ্রাণিত)।

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)

2

আপনি নিম্নলিখিত হিসাবে খুব সহজেই সুপার-সুপার ভিউ পেতে পারেন।

সেকেন্ডভিউ -> [বোতাম তদারকি]
প্রথমদর্শন -> [[বোতাম তদারকি] সুপারভিউ]

তারপরে, আপনি বোতামের অবস্থানটি পেতে পারেন ..

আপনি এটি ব্যবহার করতে পারেন:

xPosition = [[button superview] superview].frame.origin.x;
yPosition = [[button superview] superview].frame.origin.y;

4
কিছু ব্যাখ্যা যুক্ত করা এই উত্তরটি আরও দরকারী করে তুলবে।
সাগর জালা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.