রূপান্তর: টুভিউ :, রূপান্তরকরণ: ফর্মভিউ :, রূপান্তর পয়েন্ট: টু ভিউ: এবং রূপান্তর পয়েন্ট: থেকে ভিউ: পদ্ধতিগুলি বুঝতে


128

আমি এই পদ্ধতির কার্যকারিতা বোঝার চেষ্টা করছি। আপনি কি তাদের শব্দার্থবিজ্ঞান বোঝার জন্য আমাকে একটি সাধারণ ইউজকেস সরবরাহ করতে পারেন?

ডকুমেন্টেশন থেকে, উদাহরণস্বরূপ, রূপান্তর পয়েন্ট: থেকে ভিউ: পদ্ধতিটি নীচে বর্ণিত:

প্রদত্ত দৃশ্যের স্থানাংক সিস্টেম থেকে পয়েন্টটি গ্রহণের ক্ষেত্রে রূপান্তর করে।

কী তুল্য সিস্টেম মানে? রিসিভার সম্পর্কে কী ?

উদাহরণস্বরূপ, রূপান্তর পয়েন্ট: ভিউ থেকে: নীচের মত ব্যবহার করে কি তা বোঝা যায় ?

CGPoint p = [view1 convertPoint:view1.center fromView:view1];

এনএসএলগ ইউটিলিটি ব্যবহার করে, আমি যাচাই করেছি যে পি মানটি ভিউ 1 এর কেন্দ্রের সাথে মিলে যায়।

তুমাকে অগ্রিম ধন্যবাদ.

সম্পাদনা: আগ্রহীদের জন্য, আমি এই পদ্ধতিগুলি বুঝতে একটি সহজ কোড স্নিপেট তৈরি করেছি।

UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 150, 200)];
view1.backgroundColor = [UIColor redColor];

NSLog(@"view1 frame: %@", NSStringFromCGRect(view1.frame));        
NSLog(@"view1 center: %@", NSStringFromCGPoint(view1.center));   

CGPoint originInWindowCoordinates = [self.window convertPoint:view1.bounds.origin fromView:view1];        
NSLog(@"convertPoint:fromView: %@", NSStringFromCGPoint(originInWindowCoordinates));

CGPoint originInView1Coordinates = [self.window convertPoint:view1.frame.origin toView:view1];        
NSLog(@"convertPoint:toView: %@", NSStringFromCGPoint(originInView1Coordinates));

উভয় ক্ষেত্রেই স্ব। উইন্ডোটি রিসিভার। কিন্তু একটা পার্থক্য আছে। প্রথম ক্ষেত্রে কনভার্টপয়েন্ট প্যারামিটারটি ভিউ 1 স্থানাঙ্কে প্রকাশ করা হয়। আউটপুট নিম্নলিখিত:

রূপান্তর পয়েন্ট: থেকে ভিউ: {100, 100}

দ্বিতীয়টির পরিবর্তে পরিবর্তিত পয়েন্টটি তত্ত্বাবধানে (সেল্ফ উইন্ডো) স্থানাঙ্কে প্রকাশ করা হয়। আউটপুট নিম্নলিখিত:

রূপান্তরকরণ: টুভিউ: {0, 0}

উত্তর:


184

প্রতিটি দৃশ্যের নিজস্ব সমন্বিত সিস্টেম থাকে - 0,0 এবং প্রস্থ এবং উচ্চতাতে উত্স সহ। এটি boundsদেখার আয়তক্ষেত্রে বর্ণিত হয়েছে । frameদেখুন, কিন্তু, সময়ে এর উৎপত্তি মধ্যে সীমা তার superview এর আয়তক্ষেত্র থাকবে।

আপনার দর্শনক্রমের বহিরাগততম দর্শনটির উত্স 0,0 এ রয়েছে যা আইওএসের স্ক্রিনের উপরের বামের সাথে সাদৃশ্যপূর্ণ।

যদি আপনি এই দৃশ্যে 20,30 এ একটি সংক্ষিপ্তসার যুক্ত করেন, তবে সাবভিউতে 0,0 এ একটি বিন্দু সুপারভিউতে 20,30 পয়েন্টের সাথে মিলে যায়। এই রূপান্তরগুলি সেই পদ্ধতিগুলি কী করছে।

উপরের আপনার উদাহরণটি অর্থহীন (কোনও শ্লেষের উদ্দেশ্য নয়) যেহেতু এটি একটি দৃষ্টিকোণ থেকে নিজের বিন্দুতে রূপান্তরিত করে, তাই কিছুই ঘটবে না। আপনি দেখতে পাবেন যে কোনও দৃশ্যের কোনও দিকটি তার তত্ত্বাবধানের সাথে সম্পর্কিত ছিল - এটি দেখার জন্য যে কোনও দৃশ্য স্ক্রিন থেকে সরে যাচ্ছে কিনা, উদাহরণস্বরূপ:

CGPoint originInSuperview = [superview convertPoint:CGPointZero fromView:subview];

"রিসিভার" হ'ল বার্তাটি প্রাপ্ত বস্তুর জন্য একটি স্ট্যান্ডার্ড অবজেকটিভ সি শব্দ (পদ্ধতিগুলি বার্তা হিসাবেও পরিচিত) সুতরাং আমার উদাহরণে এটি প্রাপক superview


3
আপনার উত্তর, ধন্যবাদ Jrturton জন্য আপনাকে ধন্যবাদ। খুব দরকারী ব্যাখ্যা। convertPointএবং convertRectরিটার্নের ধরণে পৃথক। CGPointবা CGRect। তবে কি fromআর to? আমি ব্যবহার করতে পারি যে থাম্ব একটি নিয়ম আছে? ধন্যবাদ.
লরেঞ্জো বি

আপনি কখন থেকে রূপান্তর করতে চান, কখন থেকে রূপান্তর করতে চান?
jrturton

3
তদারকি যদি সাবউভিউয়ের সরাসরি পিতামাতার দৃষ্টিভঙ্গি না হয় তবে কী এটি এখনও কার্যকর হবে?
ভান দু ত্রান

3
@ ভানডুট্রান হ্যাঁ, যতক্ষণ না তারা একই উইন্ডোতে থাকে (যা কোনও আইওএস অ্যাপ্লিকেশনটিতে সর্বাধিক দেখা হয়)
জার্টুরটন

দুর্দান্ত উত্তর। আমার জন্য অনেক কিছুই সাফ করতে সহায়তা করেছে। কোন অতিরিক্ত পড়া?
JaeGeeTee

39

আমি সর্বদা এটির বিভ্রান্তি খুঁজে পাই তাই আমি একটি খেলার মাঠ তৈরি করেছিলাম যেখানে convertফাংশনটি কী করে তা আপনি দৃষ্টিভঙ্গি করতে পারেন । এটি সুইফ্ট 3 এবং এক্সকোড 8.1 বিতে করা হয়:

import UIKit
import PlaygroundSupport

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Main view
        view.backgroundColor = .black
        view.frame = CGRect(x: 0, y: 0, width: 500, height: 500)

        // Red view
        let redView = UIView(frame: CGRect(x: 20, y: 20, width: 460, height: 460))
        redView.backgroundColor = .red
        view.addSubview(redView)

        // Blue view
        let blueView = UIView(frame: CGRect(x: 20, y: 20, width: 420, height: 420))
        blueView.backgroundColor = .blue
        redView.addSubview(blueView)

        // Orange view
        let orangeView = UIView(frame: CGRect(x: 20, y: 20, width: 380, height: 380))
        orangeView.backgroundColor = .orange
        blueView.addSubview(orangeView)

        // Yellow view
        let yellowView = UIView(frame: CGRect(x: 20, y: 20, width: 340, height: 100))
        yellowView.backgroundColor = .yellow
        orangeView.addSubview(yellowView)


        // Let's try to convert now
        var resultFrame = CGRect.zero
        let randomRect: CGRect = CGRect(x: 0, y: 0, width: 100, height: 50)

        /*
        func convert(CGRect, from: UIView?)
        Converts a rectangle from the coordinate system of another view to that of the receiver.
        */

        // The following line converts a rectangle (randomRect) from the coordinate system of yellowView to that of self.view:
        resultFrame = view.convert(randomRect, from: yellowView)

        // Try also one of the following to get a feeling of how it works:
        // resultFrame = view.convert(randomRect, from: orangeView)
        // resultFrame = view.convert(randomRect, from: redView)
        // resultFrame = view.convert(randomRect, from: nil)

        /*
        func convert(CGRect, to: UIView?)
        Converts a rectangle from the receiver’s coordinate system to that of another view.
        */

        // The following line converts a rectangle (randomRect) from the coordinate system of yellowView to that of self.view
        resultFrame = yellowView.convert(randomRect, to: view)
        // Same as what we did above, using "from:"
        // resultFrame = view.convert(randomRect, from: yellowView)

        // Also try:
        // resultFrame = orangeView.convert(randomRect, to: view)
        // resultFrame = redView.convert(randomRect, to: view)
        // resultFrame = orangeView.convert(randomRect, to: nil)


        // Add an overlay with the calculated frame to self.view
        let overlay = UIView(frame: resultFrame)
        overlay.backgroundColor = UIColor(white: 1.0, alpha: 0.9)
        overlay.layer.borderColor = UIColor.black.cgColor
        overlay.layer.borderWidth = 1.0
        view.addSubview(overlay)
    }
}

var ctrl = MyViewController()
PlaygroundPage.current.liveView = ctrl.view

মতামতগুলি দেখার জন্য সহকারী সম্পাদক ( ) দেখাতে ভুলবেন না, এটির মতো দেখতে হবে:

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

এখানে বা এই টুকরোটিতে আরও উদাহরণ বন্টন করতে নির্দ্বিধায় ।


আপনাকে ধন্যবাদ, রূপান্তরগুলি বোঝার জন্য এটি সত্যই কার্যকর ছিল।
আনন্দ

দুর্দান্ত ওভারভিউ। তবে আমি মনে করি সেগুলি self.viewঅপ্রয়োজনীয়, সাধারণ প্রয়োজন viewযদি selfপ্রয়োজন হয় না।
জাকুব ট্রুহলি

ধন্যবাদ @ জাকুবট্রুহলি, আমি সবে সরিয়েছিself
ফাই

অনেক ধন্যবাদ! আপনার খেলার মাঠ আমাকে এই রূপান্তরগুলি কীভাবে কাজ করে তা নির্ধারণ করতে অনেক সহায়তা করেছিল।
আনোয়ার আজিজভ

30

এখানে সরল ইংরেজিতে একটি ব্যাখ্যা দেওয়া আছে।

আপনি যদি একটি subview এর RECT রূপান্তর করতে চান, তখন ( aViewএকটি subview হয় [aView superview]অন্য দৃশ্য স্থান তুল্য) ( self)।

// So here I want to take some subview and put it in my view's coordinate space
_originalFrame = [[aView superview] convertRect: aView.frame toView: self];

3
এটা সত্য নয়। এটি দৃষ্টিভঙ্গিটি সরায় না, এটি আপনাকে অন্যের শর্তে ভিউ-এর সমন্বয়গুলি দেয়। আপনার ক্ষেত্রে এটি আপনাকে স্ব-স্বস্থানে থাকবেন এমন শর্তে আপনাকে ভিউয়ের সমন্বয়গুলি দেবে।
কার্ল

সঠিক। এটি দর্শন সরিয়ে দেয় না। পদ্ধতিটি একটি সিজিআরেক্ট দেয়। সেই সিজিআরেক্টের সাথে আপনি যা চয়ন করেন তা হ'ল আপনার ব্যবসা। :-) উপরের ক্ষেত্রে, এটি স্ক্রিনে ভিজ্যুয়াল অবস্থান বজায় রাখার সময় একটি ভিউ অন্যের শ্রেণিবিন্যাসে স্থানান্তর করতে ব্যবহার করা যেতে পারে।
ঘোড়াশয় 7

14

আইওএসের প্রতিটি দৃশ্যে একটি সমন্বিত সিস্টেম থাকে। একটি সমন্বিত সিস্টেম হ'ল গ্রাফের মতো, যার এক্স অক্ষ (অনুভূমিক রেখা) এবং y অক্ষ (উল্লম্ব রেখা) থাকে। যে বিন্দুতে রেখাগুলি আন্তঃসংশ্লিষ্ট হয় তাকে মূল বলা হয়। একটি বিন্দু (x, y) দ্বারা প্রতিনিধিত্ব করা হয়। উদাহরণস্বরূপ, (2, 1) এর অর্থ হল পয়েন্টটি 2 পিক্সেল বাম, এবং 1 পিক্সেল নীচে।

আপনি এখানে সমন্বিত সিস্টেমগুলি সম্পর্কে আরও পড়তে পারেন - http://en.wikedia.org/wiki/Coordinate_system

তবে আপনার যা জানা দরকার তা হ'ল, আইওএস-এ, প্রতিটি দর্শনেই এটি OWN স্থানাঙ্ক ব্যবস্থা রয়েছে, যেখানে উপরের বাম কোণটি মূল। এক্স অক্ষগুলি ডানদিকে বাড়তে থাকে এবং y অক্ষগুলি নীচে বাড়তে থাকে।

রূপান্তরিত পয়েন্ট প্রশ্নগুলির জন্য, এই উদাহরণটি ধরুন।

ভি 1 নামে একটি ভিউ রয়েছে যা 100 পিক্সেল প্রশস্ত এবং 100 পিক্সেল উচ্চ। এখন এর অভ্যন্তরে (10, 10, 50, 50) এ ভি 2 নামে আরও একটি ভিউ রয়েছে যার অর্থ (10, 10) ভি 1 এর স্থানাঙ্ক ব্যবস্থার বিন্দু যেখানে ভি 2 এর উপরের বাম কোণটি অবস্থিত হওয়া উচিত, এবং ( 50, 50) হল V2 এর প্রস্থ এবং উচ্চতা। এখন, ভি 2 এর সমন্বিত সিস্টেমের ভিতরে একটি বিষয় নিন, বলুন (20, 20)। এখন, ভি 1 এর সমন্বিত সিস্টেমের মধ্যে সেই বিন্দুটি কী হবে? এগুলির জন্য পদ্ধতিগুলি (অবশ্যই আপনি নিজেরাই গণনা করতে পারেন তবে তারা আপনাকে অতিরিক্ত কাজ বাঁচায়)। রেকর্ডের জন্য, ভি 1 এর পয়েন্টটি হবে (30, 30)।

আশাকরি এটা সাহায্য করবে.


9

প্রশ্ন এবং আপনার উত্তর পোস্ট করার জন্য আপনাকে সবাইকে ধন্যবাদ: এটি আমাকে এটিকে বাছাই করতে সহায়তা করেছে।

আমার ভিউ কন্ট্রোলারের এটি স্বাভাবিক দৃশ্য রয়েছে।

সেই দৃশ্যের অভ্যন্তরে বেশ কয়েকটি গ্রুপিং ভিউ রয়েছে যা তাদের সন্তানের দর্শনগুলি অটো বিন্যাসের সীমাবদ্ধতার সাথে একটি পরিষ্কার মিথস্ক্রিয়া দেওয়ার চেয়ে কিছু বেশি করে।

এই গ্রুপিং ভিউগুলির মধ্যে একটিতে আমার একটি অ্যাড বাটন রয়েছে যা একটি পপওভার ভিউ কন্ট্রোলার উপস্থাপন করে যেখানে ব্যবহারকারী কিছু তথ্য প্রবেশ করে।

view
--groupingView
----addButton

ডিভাইস রোটেশনের সময় ভিউ কন্ট্রোলারটিকে ইউআইপিপভারভিউকন্ট্রোলারডেলিগেট কল পপওভারকন্ট্রোলারের মাধ্যমে সতর্ক করা হয়: উইলরপজিশনপোভারটিটোরেক্ট: ইনভিউ:

- (void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view
{
    *rect = [self.addButton convertRect:self.addbutton.bounds toView:*view];
}

উপরের প্রথম দুটি উত্তর দ্বারা প্রদত্ত ব্যাখ্যা থেকে যে অপরিহার্য অংশটি আসে তা হ'ল আমার যে রেক্টরটি রূপান্তর করার জন্য প্রয়োজন তা হ'ল অ্যাড বোতামের সীমানা , এটির ফ্রেম নয়।

আমি আরও জটিল ভিউ হায়ারার্কির সাথে এটি চেষ্টা করে দেখিনি, তবে আমার সন্দেহ হয় যে পদ্ধতি কল (ইনভিউ :) এ সরবরাহ করা ভিউটি ব্যবহার করে আমরা বহু-স্তরযুক্ত পাতাগুলি দেখার ধরণের অসুবিধাগুলি প্রায় পেয়েছি।


3
"আমাকে এড বাটনের সীমানা থেকে রূপান্তর করা দরকার, এটি ফ্রেম নয়" " - এটিকে কাজ করতে মূলত আমাকে অনেক কুৎসিত ফ্রেম কোড থেকে রক্ষা করেছে। এটি উল্লেখ করার জন্য সময় দেওয়ার জন্য ধন্যবাদ
latenitecoder

3

আমি আমার ক্ষেত্রে আবেদন করতে এই পোস্ট ব্যবহার করেছি। আশা করি এটি ভবিষ্যতে অন্য পাঠককে সহায়তা করবে।

একটি দৃশ্য কেবল তার তাত্ক্ষণিক শিশু এবং পিতামাতাদের মতামত দেখতে পারে। এটি এর পিতামহী বা পিতামহীর দৃষ্টিভঙ্গি দেখতে পাচ্ছে না।

সুতরাং, আমার ক্ষেত্রে, আমি একটি গ্র্যান্ড প্যারেন্ট দৃশ্যতে নামের self.viewএই, self.viewআমি subviews নামক যুক্ত করেছেন self.child1OfView, self.child2OfView। ইন self.child1OfView, আমি subviews নামক যুক্ত করেছেন self.child1OfView1, self.child2OfView1
এখন যদি আমি শারীরিকভাবে সরাতে self.child1OfView1সীমানা বাইরে একটি এলাকা self.child1OfViewউপর পরাগধানী ঘটনাস্থলে self.view, তারপর নতুন অবস্থানে ক্যালকুলেটর থেকে self.child1OfView1মধ্যেself.view:

CGPoint newPoint = [self.view convertPoint:self.child1OfView1.center fromView:self.child1OfView];

3

আপনি নীচের কোডটি দেখতে পাচ্ছেন যাতে আপনি বুঝতে পারেন যে এটি কীভাবে বাস্তবে কাজ করে।

    let scrollViewTemp = UIScrollView.init(frame: CGRect.init(x: 10, y: 10, width: deviceWidth - 20, height: deviceHeight - 20))

override func viewDidLoad() {
    super.viewDidLoad()

    scrollViewTemp.backgroundColor = UIColor.lightGray
    scrollViewTemp.contentSize = CGSize.init(width: 2000, height: 2000)
    self.view.addSubview(scrollViewTemp)

    let viewTemp = UIView.init(frame: CGRect.init(x: 100, y: 100, width: 150, height: 150))
    viewTemp.backgroundColor = UIColor.green
    self.view.addSubview(viewTemp)

    let viewSecond = UIView.init(frame: CGRect.init(x: 100, y: 700, width: 300, height: 300))
    viewSecond.backgroundColor = UIColor.red
    self.view.addSubview(viewSecond)

    self.view.convert(viewTemp.frame, from: scrollViewTemp)
    print(viewTemp.frame)


    /*  First take one point CGPoint(x: 10, y: 10) of viewTemp frame,then give distance from viewSecond frame to this point.
     */
    let point = viewSecond.convert(CGPoint(x: 10, y: 10), from: viewTemp)
    //output:   (10.0, -190.0)
    print(point)

    /*  First take one point CGPoint(x: 10, y: 10) of viewSecond frame,then give distance from viewTemp frame to this point.
     */
    let point1 = viewSecond.convert(CGPoint(x: 10, y: 10), to: viewTemp)
    //output:  (10.0, 210.0)
    print(point1)

    /*  First take one rect CGRect(x: 10, y: 10, width: 20, height: 20) of viewSecond frame,then give distance from viewTemp frame to this rect.
     */
    let rect1 = viewSecond.convert(CGRect(x: 10, y: 10, width: 20, height: 20), to: viewTemp)
    //output:  (10.0, 210.0, 20.0, 20.0)
    print(rect1)

    /* First take one rect CGRect(x: 10, y: 10, width: 20, height: 20) of viewTemp frame,then give distance from viewSecond frame to this rect.
     */
    let rect = viewSecond.convert(CGRect(x: 10, y: 10, width: 20, height: 20), from: viewTemp)
    //output:  (10.0, -190.0, 20.0, 20.0)
    print(rect)

}

1

আমি উত্তরটি পড়েছি এবং যান্ত্রিকগুলি বুঝতে পারি তবে আমি মনে করি চূড়ান্ত উদাহরণটি সঠিক নয়। এপিআই ডক অনুসারে, একটি ভিউর কেন্দ্রের সম্পত্তিতে তত্ত্বাবধানের সমন্বয় ব্যবস্থাতে ভিউটির পরিচিত কেন্দ্র পয়েন্ট থাকে।

যদি এটি হয় তবে আমি মনে করি তার চেয়ে সুপারভিউকে সাবউভিউ স্থানাঙ্ক সিস্টেমের থেকে একটি সংক্ষিপ্তসার কেন্দ্রে রূপান্তর করতে বলার চেষ্টা করা বুদ্ধিমান হবে না কারণ মান সাবভিউ স্থানাঙ্ক সিস্টেমে নেই। এর বিপরীতটি করা মানে কী হবে তত্ত্বাবধানের স্থানাঙ্ক সিস্টেম থেকে একটি সাবভিউতে রূপান্তর করা ...

আপনি এটি দুটি উপায়ে করতে পারেন (উভয়েরই একই মান পাওয়া উচিত):

CGPoint centerInSubview = [subview convertPoint:subview.center fromView:subview.superview];

অথবা

CGPoint centerInSubview = [subview.superview convertPoint:subview.center toView:subview];

কীভাবে এটি কাজ করা উচিত তা বোঝার জন্য আমি কি পথ ছাড়ছি?


আমার উদাহরণটি ভুল ছিল, আমি উত্তর আপডেট করেছি। আপনি যেমনটি বলেছেন, কেন্দ্র সম্পত্তিটি তত্ত্বাবধানের সমন্বিত স্থানে ইতিমধ্যে।
jrturton

1

এই API গুলি ব্যবহার সম্পর্কে আরও একটি গুরুত্বপূর্ণ বিষয়। আপনি রূপান্তর করছেন এমন রেক্টট এবং / থেকে দেখার ভিউয়ের মধ্যে প্যারেন্ট ভিউ চেইনটি সম্পূর্ণ কিনা তা নিশ্চিত হয়ে নিন। উদাহরণস্বরূপ - এভিউ, বিভিউ এবং সিভিউ -

  • এভিউ বিভিউর একটি সাবভিউ
  • আমরা aView.frame কে সিভিউতে রূপান্তর করতে চাই

সিভিউর সাবভিউ হিসাবে বিভিউ যুক্ত হওয়ার আগে আমরা যদি পদ্ধতিটি কার্যকর করার চেষ্টা করি, তবে আমরা একটি বাক্য প্রতিক্রিয়া ফিরে পাব। দুর্ভাগ্যক্রমে এই ক্ষেত্রে পদ্ধতিগুলির মধ্যে কোনও সুরক্ষা নেই। এটি সুস্পষ্ট বলে মনে হতে পারে তবে রূপান্তরটি বাবা-মায়ের দীর্ঘ শৃঙ্খলে চলে এমন ক্ষেত্রে সচেতন হওয়ার মতো বিষয়।

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