কোকো: ফ্রেম এবং সীমানা মধ্যে পার্থক্য কি?


587

UIViewএবং এর সাবক্লাসগুলির সমস্ত বৈশিষ্ট্য frameএবং রয়েছে bounds। পার্থক্য কি?



আমার জন্য সর্বাধিক সংক্ষিপ্ত ব্যাখ্যাটি এখানে: ভিডিও. Rewenderlich.com/courses/99-scrol-view-school/lessons/…
ভ্লাদ

1
2:30 ভিডিও সম্পর্কে সংক্ষিপ্ত কিছুই নেই। আমি একটি বাক্য পড়তে পারি বা 2:30 খুব বেশি দ্রুত 2:30।
dsjoerg

আমার পক্ষে এটি আরও স্পষ্ট যদি আমি এইভাবে চিন্তা করি: ফ্রেম = বাউন্ডস এবং অবস্থান
সার্জ

উত্তর:


902

সীমা একটি এর UIView হয় আয়তক্ষেত্র , একটি অবস্থান (X, Y) এবং আকার (প্রস্থ, উচ্চতা) নিজস্ব তুল্য সিস্টেম (0,0) আপেক্ষিক হিসাবে প্রকাশ।

ফ্রেম একটি এর UIView হয় আয়তক্ষেত্র , একটি অবস্থান (X, Y) এবং আকার (প্রস্থ, উচ্চতা) superview এটা মধ্যে অন্তর্ভুক্ত করা হয় আপেক্ষিক হিসাবে প্রকাশ।

সুতরাং, এমন একটি দৃশ্যের কল্পনা করুন যার আকারটি 100x100 (প্রস্থ x উচ্চতা) এর তত্ত্বাবধানের 25,25 (x, y) এ অবস্থিত। নিম্নলিখিত কোডটি এই দর্শনটির সীমা এবং ফ্রেম ছাপিয়েছে:

// This method is in the view controller of the superview
- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"bounds.origin.x: %f", label.bounds.origin.x);
    NSLog(@"bounds.origin.y: %f", label.bounds.origin.y);
    NSLog(@"bounds.size.width: %f", label.bounds.size.width);
    NSLog(@"bounds.size.height: %f", label.bounds.size.height);

    NSLog(@"frame.origin.x: %f", label.frame.origin.x);
    NSLog(@"frame.origin.y: %f", label.frame.origin.y);
    NSLog(@"frame.size.width: %f", label.frame.size.width);
    NSLog(@"frame.size.height: %f", label.frame.size.height);
}

এবং এই কোডের আউটপুট হল:

bounds.origin.x: 0
bounds.origin.y: 0
bounds.size.width: 100
bounds.size.height: 100

frame.origin.x: 25
frame.origin.y: 25
frame.size.width: 100
frame.size.height: 100

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

এখানে দুর্দান্ত উপস্থাপনা রয়েছে যা ইউআইভিউগুলি কভার করে। স্লাইডগুলি 1-20 দেখুন যা কেবল ফ্রেম এবং সীমার মধ্যে পার্থক্য ব্যাখ্যা করে না তবে চাক্ষুষ উদাহরণগুলিও দেখায়।


37
সুতরাং, বাউন্ডের জন্য x, y সর্বদা 0,0 থাকবে না কারণ এটি তার নিজের অবজেক্টের অবস্থান হিসাবে। অথবা আপনি এমন দৃশ্য দিতে পারেন যেখানে এটি হবে না?
এম কে 12

5
যতদূর আমি জানি, সীমাগুলির উত্সটি সর্বদা 0,0 থাকবে
শেক

77
আসলে, সীমানা.অরগিন 0,0 এর বাইরেও কিছু হতে পারে। উত্স সরানো / অনুবাদ করতে সেটবাউন্ডস অর্গিন: ব্যবহার করুন। আরও তথ্যের জন্য "কোকো জন্য প্রোগ্রামিং গাইড দেখুন" তে "জ্যামিতি দেখুন" দেখুন।
মেল্টেমি

127
ইউআইএসক্রোলভিউ এমন একটি উদাহরণ যেখানে সীমানাগুলি একটি দৃশ্যের মধ্যে বিভিন্ন সামগ্রী অঞ্চল দেখানোর জন্য স্থানান্তর করতে পারে।
ব্র্যাড লারসন

92
একটি ছোট্ট টিপ - NSStringFromCGRect ব্যবহার করে রিসেটগুলিতে লগ করার জন্য কিছুটা সময় বাঁচাতে পারে।
বেরিলিয়াম

645

সংক্ষিপ্ত উত্তর

ফ্রেম = পিতামাতার ভিউ এর সমন্বিত সিস্টেমটি ব্যবহার করে একটি দর্শনীয় অবস্থান এবং আকার

  • এর জন্য গুরুত্বপূর্ণ: পিতামাতার মধ্যে ভিউ স্থাপন করা

সীমানা = তার নিজস্ব সমন্বয় ব্যবস্থা ব্যবহার করে একটি দর্শনের অবস্থান এবং আকার

  • এর জন্য গুরুত্বপূর্ণ: ভিউয়ের সামগ্রী বা সাবভিউগুলি নিজের মধ্যে রাখা

বিস্তারিত উত্তর

সাহায্যের আমাকে স্মরণ করার জন্য ফ্রেম , আমি মনে একটি দেয়ালে একটি ছবি ফ্রেম । ছবির ফ্রেম একটি দেখার সীমানার মতো। আমি দেয়ালে যেখানেই ছবিটি স্থির রাখতে পারি। একইভাবে, আমি প্যারেন্ট ভিউয়ের (যেখানে একটি সুপারভিউ নামেও পরিচিত) অভ্যন্তরে যে কোনও জায়গা চাই put পিতামাতার মতামতটি দেওয়ালের মতো। আইওএসের স্থানাঙ্ক ব্যবস্থার উত্সটি বাম দিকে is আমরা ভিউ ফ্রেমের xy স্থানাঙ্ক (0, 0) এ সেট করে সুপারভাইজারের উত্সে আমাদের দৃষ্টিভঙ্গি রাখতে পারি, যা দেওয়ালের একেবারে উপরের অংশে আমাদের ছবিটি ঝুলানোর মতো। এটিকে ডানদিকে সরানো, এক্স বাড়ান, এটিকে নীচে সরানোর জন্য y বৃদ্ধি করুন।

সীমানা স্মরণে রাখতে আমাকে সাহায্য করার জন্য , আমি একটি বাস্কেটবল কোর্টের কথা ভাবি যেখানে কখনও কখনও বাস্কেটবলের সীমা ছাড়িয়ে যায় । আপনি পুরো বাস্কেটবল কোর্ট জুড়ে বলটি ড্রিবল করছেন, তবে আদালত নিজেই কোথায় আছেন তা আপনার সত্যিই যত্ন নেই। এটি কোনও জিমের বাইরে বা বাইরে একটি উচ্চ বিদ্যালয়ে বা আপনার বাড়ির সামনে হতে পারে। এটা কোন ব্যাপার না। আপনি কেবল বাস্কেটবল খেলতে চান একইভাবে, কোনও দৃশ্যের সীমাবদ্ধকরণের জন্য সমন্বিত সিস্টেমটি কেবলমাত্র নিজের দৃষ্টিভঙ্গির যত্ন করে। প্যারেন্ট ভিউতে ভিউটি কোথায় রয়েছে সে সম্পর্কে এটি কিছুই জানে না। সীমাগুলির উত্স (বিন্দু (0, 0) ডিফল্টরূপে) ভিউয়ের শীর্ষ বাম কোণে। এই দৃষ্টিভঙ্গিটির যে কোনও সংক্ষিপ্তসার এই পয়েন্টের সাথে সম্পর্কিত। এটি বাস্কেটবলকে কোর্টের সামনের বাম কোণে নিয়ে যাওয়ার মতো।

আপনি ফ্রেম এবং সীমা তুলনা করার চেষ্টা করার সময় এখন বিভ্রান্তি আসে। যদিও এটি প্রথমে দেখে মনে হচ্ছে ততটা খারাপ নয়। আমাদের বুঝতে সহায়তা করতে কয়েকটি ছবি ব্যবহার করুন।

ফ্রেম বনাম বাউন্ডস

বাম দিকে প্রথম ছবিতে আমাদের একটি ভিউ রয়েছে যা এর প্যারেন্ট ভিউয়ের উপরের বামে অবস্থিত। হলুদ আয়তক্ষেত্রটি দেখার ফ্রেমের প্রতিনিধিত্ব করে। ডানদিকে আমরা আবার দৃশ্যটি দেখতে পেলাম কিন্তু এবার পিতামাতার ভিউটি প্রদর্শিত হবে না। কারণ সীমানা পিতামাতার ভিউ সম্পর্কে জানে না। সবুজ আয়তক্ষেত্রটি দেখার সীমাটি উপস্থাপন করে। লাল বিন্দু উভয় চিত্র উপস্থাপন করে মূল ফ্রেম বা সীমার।

Frame
    origin = (0, 0)
    width = 80
    height = 130

Bounds 
    origin = (0, 0)
    width = 80
    height = 130

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

সুতরাং ফ্রেম এবং সীমানা ছবিতে ঠিক একই ছিল। আসুন একটি উদাহরণটি দেখুন যেখানে তারা আলাদা।

Frame
    origin = (40, 60)  // That is, x=40 and y=60
    width = 80
    height = 130

Bounds 
    origin = (0, 0)
    width = 80
    height = 130

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

সুতরাং আপনি দেখতে পারেন যে ফ্রেমের xy স্থানাঙ্ক পরিবর্তন করা এটি প্যারেন্ট ভিউতে সরিয়ে নিয়েছে। তবে নিজের দেখার বিষয়বস্তুটি এখনও ঠিক একইরকম দেখাচ্ছে। সীমানা কোন ধারণা যে কোন পৃথক আছে।

এখন পর্যন্ত ফ্রেম এবং সীমানা উভয়ের প্রস্থ এবং উচ্চতা হুবহু একই ছিল। যদিও এটি সর্বদা সত্য নয়। যদি আমরা 20 ডিগ্রি ঘড়ির কাঁটার দিকে ঘোরাই তবে কী হবে দেখুন। (রোটেশন ট্রান্সফর্ম ব্যবহার করে করা হয় more আরও তথ্যের জন্য ডকুমেন্টেশন এবং এই ভিউ এবং স্তর উদাহরণগুলি দেখুন))

Frame
    origin = (20, 52)  // These are just rough estimates.
    width = 118
    height = 187

Bounds 
    origin = (0, 0)
    width = 80
    height = 130

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

আপনি দেখতে পাচ্ছেন যে সীমাগুলি এখনও একইরকম। তারা এখনও কিছুই জানে না! যদিও ফ্রেমের মানগুলি সমস্ত পরিবর্তিত হয়েছে।

ফ্রেম এবং সীমার মধ্যে পার্থক্যটি দেখতে এখন একটু সহজ, তাই না? আপনি সম্ভবত ফ্রেম এবং সীমানা বোঝেন না নিবন্ধটি একটি ভিউ ফ্রেম হিসাবে সংজ্ঞায়িত করে

... তার দৃষ্টিভঙ্গির মধ্যে সবচেয়ে ছোট বাউন্ডিং বাক্সটি তার পিতামাতার সাথে সমন্বয় ব্যবস্থা সম্পর্কিত দৃষ্টিভঙ্গি, সেই দৃশ্যে প্রয়োগ হওয়া কোনও রূপান্তর সহ।

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

গুরুত্বপূর্ণ: যদি কোনও দৃশ্যের transformসম্পত্তিতে পরিচয় রূপান্তর না থাকে তবে সেই দৃশ্যের ফ্রেমটি অপরিজ্ঞাত হয় এবং তাই এর স্বতঃবৃত্তিমূলক আচরণের ফলাফল are

বরং অটোরিসাইজিংয়ের জন্য দুর্ভাগ্য .... যদিও আপনি কিছু করতে পারেন তবে।

অ্যাপল ডক্স স্টেট:

transformআপনার দর্শনটির সম্পত্তি পরিবর্তন করার সময় , সমস্ত রূপান্তরগুলি ভিউয়ের কেন্দ্র বিন্দুটির সাথে সম্পর্কিত হয়।

সুতরাং যদি কোনও রূপান্তর সম্পন্ন হওয়ার পরে আপনার পিতামাতার মধ্যে একটি ভিউ স্থানান্তরিত করার দরকার হয় তবে আপনি view.centerস্থানাঙ্কগুলি পরিবর্তন করে এটি করতে পারেন । পছন্দ করুন frame, centerপ্যারেন্ট ভিউয়ের সমন্বয় ব্যবস্থা ব্যবহার করে।

ঠিক আছে, আসুন আমাদের ঘূর্ণন থেকে মুক্তি এবং সীমানায় ফোকাস করি। এখনও অবধি সীমানা উত্স সর্বদা স্থায়ী হয়েছে (0, 0) যদিও এটি করার দরকার নেই। আমাদের দৃশ্যে যদি একটি বৃহত সাবভিউ থাকে যা সমস্ত একবারে প্রদর্শিত হয় না? আমরা এটি UIImageViewএকটি বৃহত চিত্র সহ একটি করব । এখানে আবার আমাদের দ্বিতীয় চিত্রটি রয়েছে, তবে এবার আমরা দেখতে পাব যে আমাদের দৃশ্যের সংক্ষিপ্তসারটি পুরো সামগ্রীটি কেমন দেখাচ্ছে।

Frame
    origin = (40, 60)
    width = 80
    height = 130

Bounds 
    origin = (0, 0)
    width = 80
    height = 130

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

শুধুমাত্র চিত্রের উপরের বাম কোণটি দেখার সীমানার ভিতরে ফিট করতে পারে। এখন দেখুন যদি আমরা সীমাটির মূল স্থানাঙ্কগুলি পরিবর্তন করি তবে কী ঘটে।

Frame
    origin = (40, 60)
    width = 80
    height = 130

Bounds 
    origin = (280, 70)
    width = 80
    height = 130

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

ফ্রেমটি তত্ত্বাবধানে সরানো হয়নি তবে ফ্রেমের অভ্যন্তর সামগ্রী বদলে গেছে কারণ সীমার আয়তক্ষেত্রের উত্স ভিউর ভিন্ন অংশে শুরু হয়। এটি UIScrollViewএবং এর সাবক্লাসগুলির পিছনে পুরো ধারণাটি (উদাহরণস্বরূপ, ক UITableView)। আরও ব্যাখ্যার জন্য ইউআইএসক্রোলভিউ বোঝা দেখুন ।

কখন ফ্রেম ব্যবহার করবেন এবং কখন সীমা ব্যবহার করবেন

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

boundsযখন আপনি অভ্যন্তরীণ পরিবর্তনগুলি করছেন , যেমন জিনিস আঁকতে বা দৃশ্যের মধ্যে সাবউভিউগুলি সাজানোর মতো ব্যবহার করুন । এছাড়াও যদি আপনি এটিতে কোনও স্থানান্তর করেন তবে দৃশ্যের আকার পেতে সীমানাটি ব্যবহার করুন।

আরও গবেষণার জন্য নিবন্ধ:

অ্যাপল ডকস

সম্পর্কিত স্ট্যাকওভারফ্লো প্রশ্ন

অন্যান্য উৎস

নিজে অনুশীলন করুন

উপরের নিবন্ধগুলি পড়ার পাশাপাশি এটি আমাকে একটি পরীক্ষা অ্যাপ তৈরি করতে অনেক সহায়তা করে। আপনি অনুরূপ কিছু করার চেষ্টা করতে পারেন। (আমি এই ভিডিও কোর্সটি থেকে ধারণা পেয়েছি তবে দুর্ভাগ্যক্রমে এটি নিখরচায় নয়))

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

আপনার রেফারেন্সের জন্য কোডটি এখানে:

import UIKit

class ViewController: UIViewController {


    @IBOutlet weak var myView: UIView!

    // Labels
    @IBOutlet weak var frameX: UILabel!
    @IBOutlet weak var frameY: UILabel!
    @IBOutlet weak var frameWidth: UILabel!
    @IBOutlet weak var frameHeight: UILabel!
    @IBOutlet weak var boundsX: UILabel!
    @IBOutlet weak var boundsY: UILabel!
    @IBOutlet weak var boundsWidth: UILabel!
    @IBOutlet weak var boundsHeight: UILabel!
    @IBOutlet weak var centerX: UILabel!
    @IBOutlet weak var centerY: UILabel!
    @IBOutlet weak var rotation: UILabel!

    // Sliders
    @IBOutlet weak var frameXSlider: UISlider!
    @IBOutlet weak var frameYSlider: UISlider!
    @IBOutlet weak var frameWidthSlider: UISlider!
    @IBOutlet weak var frameHeightSlider: UISlider!
    @IBOutlet weak var boundsXSlider: UISlider!
    @IBOutlet weak var boundsYSlider: UISlider!
    @IBOutlet weak var boundsWidthSlider: UISlider!
    @IBOutlet weak var boundsHeightSlider: UISlider!
    @IBOutlet weak var centerXSlider: UISlider!
    @IBOutlet weak var centerYSlider: UISlider!
    @IBOutlet weak var rotationSlider: UISlider!

    // Slider actions
    @IBAction func frameXSliderChanged(sender: AnyObject) {
        myView.frame.origin.x = CGFloat(frameXSlider.value)
        updateLabels()
    }
    @IBAction func frameYSliderChanged(sender: AnyObject) {
        myView.frame.origin.y = CGFloat(frameYSlider.value)
        updateLabels()
    }
    @IBAction func frameWidthSliderChanged(sender: AnyObject) {
        myView.frame.size.width = CGFloat(frameWidthSlider.value)
        updateLabels()
    }
    @IBAction func frameHeightSliderChanged(sender: AnyObject) {
        myView.frame.size.height = CGFloat(frameHeightSlider.value)
        updateLabels()
    }
    @IBAction func boundsXSliderChanged(sender: AnyObject) {
        myView.bounds.origin.x = CGFloat(boundsXSlider.value)
        updateLabels()
    }
    @IBAction func boundsYSliderChanged(sender: AnyObject) {
        myView.bounds.origin.y = CGFloat(boundsYSlider.value)
        updateLabels()
    }
    @IBAction func boundsWidthSliderChanged(sender: AnyObject) {
        myView.bounds.size.width = CGFloat(boundsWidthSlider.value)
        updateLabels()
    }
    @IBAction func boundsHeightSliderChanged(sender: AnyObject) {
        myView.bounds.size.height = CGFloat(boundsHeightSlider.value)
        updateLabels()
    }
    @IBAction func centerXSliderChanged(sender: AnyObject) {
        myView.center.x = CGFloat(centerXSlider.value)
        updateLabels()
    }
    @IBAction func centerYSliderChanged(sender: AnyObject) {
        myView.center.y = CGFloat(centerYSlider.value)
        updateLabels()
    }
    @IBAction func rotationSliderChanged(sender: AnyObject) {
        let rotation = CGAffineTransform(rotationAngle: CGFloat(rotationSlider.value))
        myView.transform = rotation
        updateLabels()
    }

    private func updateLabels() {

        frameX.text = "frame x = \(Int(myView.frame.origin.x))"
        frameY.text = "frame y = \(Int(myView.frame.origin.y))"
        frameWidth.text = "frame width = \(Int(myView.frame.width))"
        frameHeight.text = "frame height = \(Int(myView.frame.height))"
        boundsX.text = "bounds x = \(Int(myView.bounds.origin.x))"
        boundsY.text = "bounds y = \(Int(myView.bounds.origin.y))"
        boundsWidth.text = "bounds width = \(Int(myView.bounds.width))"
        boundsHeight.text = "bounds height = \(Int(myView.bounds.height))"
        centerX.text = "center x = \(Int(myView.center.x))"
        centerY.text = "center y = \(Int(myView.center.y))"
        rotation.text = "rotation = \((rotationSlider.value))"

    }

}

দেখে মনে হচ্ছে বাউন্ডের প্রস্থ এবং উচ্চতা অপ্রয়োজনীয় এবং একটি "উত্স" সম্পত্তি যথেষ্ট ছিল (যেমন এটি ফ্ল্যাশের সাথে ছিল)।
ইয়ান ওয়ারবার্টন

"জিনিস আঁকার মতো বা দৃশ্যের মধ্যে সাবউভিউগুলি সাজানোর জন্য" সীমা ব্যবহার করুন। আপনার অর্থ যদি আমার কাছে একটি ভিউ কনট্রোলার থাকে যাতে দুটি বোতাম রয়েছে আমার কি ভিউ'র নিয়ন্ত্রণকারীর 'সীমানা' ব্যবহার করে বোতামগুলি রাখা উচিত ?! আমি সবসময় দেখার ফ্রেম ব্যবহার করেছি ...
মধু

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

5
তৈরী করা হয়েছে github.com/maniramezan/FrameVsBounds.git বুঝতে ভাল সাহায্য করার জন্য এখানে দেওয়া উদাহরণ অ্যাপ্লিকেশন উপর ভিত্তি করে রেপো boundsবনাম frameএকটি দৃশ্য আছে।
ম্যানম্যান

ধন্যবাদ! ভাল ব্যাখ্যা। একটি চিত্র 1000 শব্দের চেয়ে মূল্যবান
পেড্রো ট্রুজিলো

43

নীচে কোড চালানোর চেষ্টা করুন

- (void)viewDidLoad {
    [super viewDidLoad];
    UIWindow *w = [[UIApplication sharedApplication] keyWindow];
    UIView *v = [w.subviews objectAtIndex:0];

    NSLog(@"%@", NSStringFromCGRect(v.frame));
    NSLog(@"%@", NSStringFromCGRect(v.bounds));
}

এই কোডের আউটপুট হল:

কেস ডিভাইস ওরিয়েন্টেশন হল প্রতিকৃতি

{{0, 0}, {768, 1024}}
{{0, 0}, {768, 1024}}

কেস ডিভাইস ওরিয়েন্টেশন হ'ল ল্যান্ডস্কেপ

{{0, 0}, {768, 1024}}
{{0, 0}, {1024, 768}}

স্পষ্টতই, আপনি ফ্রেম এবং সীমা মধ্যে পার্থক্য দেখতে পারেন


2
এটি আর সত্য নয় (আইওএস 8)
জুলিয়ান ক্রোল 12'14


13

ফ্রেম আয়তক্ষেত্র যে সঙ্গে UIView সংজ্ঞায়িত হয় তার superview থেকে সম্মান

সীমা RECT মান যে সংজ্ঞায়িত যে পরিসর NSView তুল্য সিস্টেম।

অর্থাৎ এই আয়তক্ষেত্রের যে কোনও কিছুই আসলে ইউআইভিউতে প্রদর্শিত হবে।


10

ফ্রেম হ'ল তার সুপার ভিউয়ের সমন্বয় ব্যবস্থাতে ভিউটির উত্স (ওপরে বাম কোণে) এবং এর আকার, এর অর্থ হল আপনি ফ্রেমের উত্স পরিবর্তন করে দৃশ্যের উচ্চতর দৃশ্যে অনুবাদ করেন, অন্যদিকে সীমা তার আকার এবং উত্স নিজস্ব সমন্বিত সিস্টেম, সুতরাং ডিফল্টরূপে সীমা উত্স (0,0) হয়।

বেশিরভাগ সময় ফ্রেম এবং সীমানাগুলি একত্রিত হয় তবে উদাহরণস্বরূপ আপনার ফ্রেম ((140,65), (200,250)) এবং সীমানা ((0,0), (200,250) এর মতামত থাকলে এবং দৃশ্যটি কাত করে দেওয়া হয়েছিল যাতে এটি তার নীচে ডান কোণে দাঁড়িয়ে থাকে, তবে সীমাগুলি এখনও ((0,0), (200,250)) হবে তবে ফ্রেমটি তা নয়।

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

ফ্রেমটি ক্ষুদ্রতম আয়তক্ষেত্র হবে যা ভিউকে আবদ্ধ / ঘিরে রেখেছে, সুতরাং ফ্রেমটি (ছবির মতো) হবে ((140,65), (320,320))।

আর একটি পার্থক্য উদাহরণস্বরূপ যদি আপনার কাছে এমন সুপারভিউ থাকে যার সীমানা ((0,0), (200,200)) এবং এই সুপারভিউতে একটি সাবভিউ থাকে যার ফ্রেম ((20,20), (100,100)) থাকে এবং আপনি সুপারভিউ সীমানা পরিবর্তন করেন ((20,20), (200,200)) এ, তারপরে সাবভিউ ফ্রেমটি এখনও ((20,20), (100,100)) হবে তবে (20,20) দ্বারা অফসেট করা হয়েছে কারণ এর তত্ত্বাবধানের সমন্বয় ব্যবস্থা (20, 20)।

আমি এই কারো সাহায্য করে আশা করি.


শেষ অনুচ্ছেদে সম্পর্কিত: subView ফ্রেম এর সাথে সম্পর্কিত superViewsuperViewকোনও কিছুর সীমানা পরিবর্তন করা মূলটিকে subViewএর সাথে মিলে যায় না superView
স্ট্যাটিকভয়েডম্যান

5

এর সুপারভিউ এর সাথে সম্পর্কিত এটি ফ্রেম করুন যেখানে তার এনএসভিউর সাথে সম্পর্কিত বাউন্ডস।

উদাহরণ: এক্স = 40, ওয়াই = 60. এছাড়াও 3 টি ভিউ রয়েছে his এই চিত্রটি আপনাকে পরিষ্কার ধারণাটি দেখায়।

ফ্রেম

কোট


4

আমার 5 সেন্ট যোগ করুন।

ফ্রেমটি পিতামাতার দৃশ্যের সাথে প্যারেন্ট ভিউয়ের ভিতরে রাখার জন্য ব্যবহৃত হয়।

বাউন্ডাগুলি ভিউ নিজেই এটির নিজস্ব সামগ্রী স্থাপন করতে ব্যবহার করে (যেমন কোনও স্ক্রোল ভিউ স্ক্রোল করার সময় করে)। ক্লিপটোবাউন্ডও দেখুন । বাউন্ডগুলি ভিউয়ের সামগ্রীটি জুম ইন / আউট করতেও ব্যবহৃত হতে পারে।

সাদৃশ্য:
ফ্রেম ~ টিভি স্ক্রিন
বাউন্ডস ~ ক্যামেরা (জুম, সরানো, ঘোরানো)


2

উপরের উত্তরগুলি খুব ভালভাবে বাউন্ড এবং ফ্রেমের মধ্যে পার্থক্য ব্যাখ্যা করেছে।

সীমাবদ্ধতা: তার নিজস্ব সমন্বয় ব্যবস্থা অনুযায়ী একটি দর্শন আকার এবং অবস্থান।

ফ্রেম: একটি দৃশ্যের আকার এবং এর সুপারভিউয়ের সাথে সম্পর্কিত অবস্থান।

তারপরে এমন বিভ্রান্তি রয়েছে যে এক্স বাউন্ডের ক্ষেত্রে ওয়াই সর্বদা "0" হবে। এটি সত্য নয় । এটি ইউআইএসক্রোলভিউ এবং ইউআইসি কলিকেশনভিউতেও বোঝা যায়।

যখন সীমাগুলির x, y হয় না 0
আসুন ধরে নেওয়া যাক আমাদের একটি ইউআইএসক্রোলভিউ রয়েছে। আমরা পৃষ্ঠাগুলি প্রয়োগ করেছি। ইউআইএসক্রোলভিউতে 3 টি পৃষ্ঠা রয়েছে এবং এর বিষয়বস্তুর আকারের স্ক্রিন প্রস্থ তিনগুণ হয়েছে (ধরুন স্ক্রিনউইথথ 320)। উচ্চতা স্থির থাকে (ধরে নিই 200)।

scrollView.contentSize = CGSize(x:320*3, y : 200)

উপভিউ হিসাবে তিনটি ইউআইআইমেজভিউ যুক্ত করুন এবং ফ্রেমের x মানটি ঘনিষ্ঠভাবে দেখুন

let imageView0 = UIImageView.init(frame: CGRect(x:0, y: 0 , width : scrollView.frame.size.width, height : scrollView.frame.size.height))
let imageView1 :  UIImageView.init( frame: CGRect(x:320, y: 0 , width : scrollView.frame.size.width, height : scrollView.frame.size.height))
let imageView2 :  UIImageView.init(frame: CGRect(x:640, y: 0 , width : scrollView.frame.size.width, height : scrollView.frame.size.height))
scrollView.addSubview(imageView0)
scrollView.addSubview(imageView0)
scrollView.addSubview(imageView0)
  1. পৃষ্ঠা 0: যখন স্ক্রোলভিউ 0 পৃষ্ঠায় থাকবে তখন সীমাগুলি হবে (x: 0, y: 0, প্রস্থ: 320, উচ্চতা: 200)

  2. পৃষ্ঠা 1: স্ক্রোল করুন এবং পৃষ্ঠা 1 এ যান।
    এখন সীমাগুলি হবে (x: 320, y: 0, প্রস্থ: 320, উচ্চতা: 200) মনে রাখবেন আমরা এর নিজস্ব সমন্বিত সিস্টেমের প্রতি শ্রদ্ধা রেখে বলেছি। সুতরাং এখন আমাদের স্ক্রোলভিউয়ের "দৃশ্যমান অংশ" এর 320-এ "এক্স" রয়েছে image চিত্রভিউ 1 এর ফ্রেমটি দেখুন।

  3. পৃষ্ঠা 2: স্ক্রোল করুন এবং পৃষ্ঠাগুলি 2 সীমার দিকে যান : (x: 640, y: 0, প্রস্থ: 320, উচ্চতা: 200) আবার চিত্রের ভিউ 2 এর ফ্রেমটি দেখুন

ইউআইকোলিকেশনভিউয়ের ক্ষেত্রেও একই। কালেকশনভিউতে দেখার সহজতম উপায় হ'ল এটিকে স্ক্রোল করা এবং এর সীমানাগুলি মুদ্রণ / লগ করা এবং আপনি ধারণাটি পাবেন।


2

উপরের সমস্ত উত্তর সঠিক এবং এটি আমার এই গ্রহণ:

ফ্রেম এবং সীমানার মধ্যে পার্থক্য জানাতে কনসপটস বিকাশকারীকে পড়তে হবে:

  1. তত্ত্বাবধানের তুলনায় (একটি প্যারেন্ট ভিউ) এটি = এফআরএম এর মধ্যে রয়েছে
  2. এটির নিজস্ব সমন্বিত সিস্টেমের সাথে সম্পর্কিত, এর উপরিউক্ত অবস্থান = বাউন্ডস নির্ধারণ করে

"সীমা" বিভ্রান্তিকর কারণ এটি এমন ধারণা দেয় যে স্থানাঙ্কগুলি সেই দৃশ্যের অবস্থান যেটির জন্য সেট করা হয়েছে। তবে এগুলি ফ্রেমের ধ্রুবক অনুসারে সম্পর্কযুক্ত এবং সামঞ্জস্য হয়।

আইফোন স্ক্রিন


1

ফ্রেম এবং সীমাগুলির মধ্যে পার্থক্য দেখানোর জন্য আরও একটি চিত্রণ। এই উদাহরণে:

  • View B এর একটি সংক্ষিপ্তসার View A
  • View B সরানো হয়েছিল x:60, y: 20
  • View B ঘোরানো হয়েছিল 45 degrees

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


0

ফ্রেম বনাম আবদ্ধ

  • আপনি যদি X: 0, Y: 0, প্রস্থ: 400, উচ্চতা: 400 এ একটি ভিউ তৈরি করেন তবে এর ফ্রেম এবং সীমানা একই।
  • আপনি যদি এই ভিউটি এক্স: 400 এ স্থানান্তর করেন তবে এর ফ্রেমটি সেই পরিবর্তনটি প্রতিফলিত করবে তবে এর সীমানাটি হবে না। মনে রাখবেন, সীমাগুলি ভিউয়ের নিজস্ব জায়গার সাথে সম্পর্কিত এবং অভ্যন্তরীণভাবে ভিউয়ের সাথে কিছুই বদলেনি।
  • যদি আপনি দর্শনটি রূপান্তর করেন, উদাহরণস্বরূপ এটিকে ঘোরানো বা এটি স্কেলিং করা, ফ্রেমটি এটি প্রতিবিম্বিত করতে পরিবর্তিত হবে তবে সীমানা এখনও তা করবে না - যতক্ষণ দৃষ্টিভঙ্গি অভ্যন্তরীণভাবে সম্পর্কিত, এটি পরিবর্তন হয়নি।
  • আপনি যদি সীমানা পরিবর্তন করেন তবে এটি ফ্রেমের অভ্যন্তরে সামগ্রী পরিবর্তন করবে কারণ সীমানার আয়তক্ষেত্রের উত্স ভিউর ভিন্ন অংশে শুরু হয়।

-1

ফ্রেম = পিতামাতার ভিউ এর সমন্বিত সিস্টেমটি ব্যবহার করে একটি দর্শনীয় অবস্থান এবং আকার

সীমানা = তার নিজস্ব সমন্বয় ব্যবস্থা ব্যবহার করে একটি দর্শনের অবস্থান এবং আকার

একটি দৃশ্য দুটি আয়তক্ষেত্র ব্যবহার করে এর আকার এবং অবস্থান ট্র্যাক করে: একটি ফ্রেম আয়তক্ষেত্র এবং একটি চৌম্বক আয়তক্ষেত্র। ফ্রেম আয়তক্ষেত্রটি তত্ত্বাবধানের সমন্বিত সিস্টেমটি ব্যবহার করে তদারকিতে ভিউটির অবস্থান এবং আকারকে সংজ্ঞায়িত করে। সীমানা আয়তক্ষেত্রটি অভ্যন্তর স্থানাঙ্ক ব্যবস্থাটিকে সংজ্ঞায়িত করে যা উত্স এবং স্কেলিং সহ ভিউয়ের সামগ্রীগুলি আঁকতে ব্যবহৃত হয়। চিত্র 2-1 ফ্রেমে আয়তক্ষেত্রের মধ্যে, বাম দিকে এবং সীমানা আয়তক্ষেত্রের ডানদিকে সম্পর্ক দেখায় ”"

সংক্ষেপে, ফ্রেমটি একটি দৃশ্যের তত্ত্বাবধানের ধারণা এবং সীমানা হল ভিউর নিজস্ব ধারণা। একাধিক সমন্বয় সিস্টেম থাকা, প্রতিটি দর্শনের জন্য একটি, ভিউ হায়ারার্কির অংশ।


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