কীভাবে ইউআইভিউর একটি পর্যবেক্ষণ কেন্দ্র করে center


128

আমার UIViewএকটি UIViewমিটার একটি অভ্যন্তর রয়েছে এবং আমি চাই যে অভ্যন্তরটি UIViewপ্রস্থ এবং উচ্চতাটির আকার পরিবর্তন না করেই সবসময় বাইরের দিকের অভ্যন্তরে কেন্দ্রীভূত থাকে।

আমি স্ট্রটস এবং স্প্রিংস সেট করেছি যাতে এটি পুনরায় আকার সেট না করে উপরে / বাম / ডান / নীচে থাকে। তবে এটি এখনও কেন্দ্র করে না। কোন ধারণা?


2
গৃহীত উত্তরটি ভুল এবং ক্রাশ হবে। হেজাজির উত্তর দুর্দান্ত কাজ করে।
ফ্যাটি

উত্তর:


209

উদ্দেশ্য গ

yourSubView.center = CGPointMake(yourView.frame.size.width  / 2, 
                                 yourView.frame.size.height / 2);

দ্রুতগতি

yourSubView.center = CGPoint(x: yourView.frame.size.width  / 2,
                             y: yourView.frame.size.height / 2)

51
আপনার ব্যবহার করা উচিত boundsএবং নয় frame, যেমন frameভিউটিতে একটি থাকলে এটি অপরিজ্ঞাত transform
ওমজ

1
এটি কেবলমাত্র sizeব্যবহৃত হিসাবে এটি এক্ষেত্রে আলাদা করবে না ।
পিটার ডিউইউজ

1
এটি কোনও বিষয় নয়, frameযদি পুরোপুরি সম্পত্তি অপরিজ্ঞাত হয় তবে যদি ভিউটিতে এমনটি থাকে transformযা পরিচয় রূপান্তর নয়; ইউআইভিউর ফ্রেমের সম্পত্তিতে ডকুমেন্টেশন পড়ুন ।
ওমজ

6
দুর্ভাগ্যক্রমে এই উত্তরটি আসলে ভুল । কেবল হেজার সঠিক উত্তরটি ব্যবহার করুন।
ফ্যাটি

@ ফট্টি এখানে ঠিক কী ভুল? আমি এটিকে কোনও দৃশ্যের মধ্যে একটি চিত্র ভিউ কেন্দ্রীকরণের জন্য ব্যবহার করেছি এবং এটি কাজ করছে।
jreft56

284

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

child.center = [parent convertPoint:parent.center fromView:parent.superview];

এবং সুইফ্টের জন্য:

child.center = parent.convert(parent.center, from:parent.superview)

1
এবং এর পরে ভুলে যাবেন না, চাইল্ড.ফ্রেমে = সিজিআরেক্টইন্টেগ্রাল (চাইল্ড.ফ্রেমে);
ফ্যাটি

8
এক: এটি কেবলমাত্র তখনই কার্যকর হয় যদি আপনি আপনার পিতামাতার দৃশ্যের কেন্দ্র / অবস্থান পরিবর্তন না করেন। দ্বিতীয়: আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে পয়েন্টটি রূপান্তর করার কোনও প্রয়োজন নেই (এটি ইতিমধ্যে সঠিক ফর্ম্যাটে রয়েছে) কেবল ব্যবহার করুন child.center = parent.center। আমি `চাইল্ড.সেন্টার = সিজিপয়েন্ট মেক (প্যারেন্ট.বাউন্ডস.ইহাইট / 2, প্যারেন্ট.বাউন্ডস.উইথথ / 2) 'ব্যবহার করব। আপনার প্যারেন্ট ভিউ সেন্টারটি সেট করা নির্বিশেষে এটি সর্বদা আপনার সাবভিউকে কেন্দ্র করে রাখবে।
পুরাতন নাম

1
ভিউ হায়ারার্কিতে ভিউটি এখনও যুক্ত না করা হলে এটিও কার্যকর নয় (যেমন বস্তুর সূচনা করার সময়)
ভিক্টর জ্যালেন্সাস

1
@ হেজাজী খুব দ্রুত উত্তরটি যোগ করা ভাল লাগবে;)
মিলাদ ফরিদনিয়া

1
@ সৌমেন না, একটি পার্থক্য আছে। UIView.boundsআপেক্ষিক দৃশ্য নিজেই (এবং bounds.originসময়, প্রাথমিকভাবে শূন্য) UIView.centerসিস্টেম তুল্য উল্লেখ করা হয় superview
হেজাজি

41

আমরা শুরু করার আগে, আসুন কেবল স্মরণ করিয়ে দিই যে মূল পয়েন্টটি CGPointএকটি দৃশ্যের উপরের বাম কোণ । মতামত এবং পিতামাতাদের সম্পর্কে একটি গুরুত্বপূর্ণ বিষয়।

এই সাধারণ কোডটি একবার দেখে নেওয়া যাক, এমন একটি ভিউ কন্ট্রোলার যা এটি একটি কালো বর্গক্ষেত্রের ভিউতে যুক্ত করে:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        createDummyView()
        super.view.backgroundColor = UIColor.cyanColor();
    }

    func createDummyView(){
        var subView = UIView(frame: CGRect(x: 15, y: 50, width: 50 , height: 50));
        super.view.addSubview(subView);
        view.backgroundColor = UIColor.blackColor()
    }

}

এটি এই দর্শনটি তৈরি করবে: কালো আয়তক্ষেত্রের উত্স এবং কেন্দ্রটি এর পিতামাতার মতো একই স্থানাঙ্কের সাথে খাপ খায়

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

এখন আসুন সাবভিউকে আরেকটি সাবসভিউ ভিউ যুক্ত করার চেষ্টা করি এবং সাবসউভিউকে সাবভিউয়ের মতো একই উত্স প্রদান করি তবে সাবসউবভিউকে সাবভিউয়ের চাইল্ড ভিউ তৈরি করি

আমরা এই কোডটি যুক্ত করব:

var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)

এবং এই ফলাফল:

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

এই লাইনের কারণে:

subSubView.frame.origin = subView.frame.origin;

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

এই কারণেই আপনাকে সর্বদা এটির আবদ্ধ আয়তক্ষেত্র দ্বারা পিতামাতার কাছে উল্লেখ করতে হবে, যা এটির উপভিউগুলির "জগত", এই লাইনটি এখানে ঠিক করতে দিন:

subSubView.frame.origin = subView.bounds.origin;

এবং যাদুটি দেখুন, সাবসউভিউটি এখন এটির মূল উত্সে অবস্থিত:

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

সুতরাং, আপনি পছন্দ করেন "ঠিক আছে আমি কেবল আমার পিতামাতার দর্শন দ্বারা আমার দৃষ্টিভঙ্গিটি কেন্দ্র করে রাখতে চেয়েছিলাম, বড় বিষয়টি কী?" ভাল, এটি কোনও বড় বিষয় নয়, আপনাকে কেবল পিতৃতান্ত্রিক কেন্দ্রের বিন্দুটি "অনুবাদ" করতে হবে যা এটির মাধ্যমে ফ্রেম থেকে পিতামাতার সীমানা কেন্দ্রে নেওয়া হয়:

subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);

আপনি তাকে প্রকৃতপক্ষে বলছেন "পিতামাতার দর্শন কেন্দ্রটি নিয়ে যান, এবং এটিকে সাবসউভিউ বিশ্বে রূপান্তর করুন"।

এবং আপনি এই ফলাফল পাবেন:

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


'সাবসউবভিউ.সেন্টার = সাবভিউ.কোভার্টপয়েন্ট (সাবভিউ.সেন্টার, ভিউ: সাবসুউভিউ)' লাইনটি কোথায় রাখা হবে?
থমরাই টি

26

আমি ব্যবহার করব:

self.childView.center = CGPointMake(CGRectGetMidX(self.parentView.bounds),
                                    CGRectGetMidY(self.parentView.bounds));

আমি CGRectবিকল্পগুলি ব্যবহার করতে চাই ...

সুইফট 3:

self.childView.center = CGPoint(x: self.parentView.bounds.midX,
                                        y: self.parentView.bounds.midY);

19

1. যদি আপনি অটোলেআউট সক্ষম করে থাকেন:

  • ইঙ্গিত: অটোলেআউট সহ অন্য ভিউতে একটি ভিউ কেন্দ্রের জন্য আপনি কমপক্ষে একটি পিতামাতাম ভিউ ভাগ করে নেওয়ার জন্য যে কোনও দুটি মতামতের জন্য একই কোড ব্যবহার করতে পারেন।

সবার আগে শিশু দৃষ্টিভঙ্গিগুলি স্বয়ংক্রিয়রূপে অক্ষম করুন

UIView *view1, *view2;
[childview setTranslatesAutoresizingMaskIntoConstraints:NO];
  1. আপনি যদি ইউআইভিউ + অটোলেআউট বা পুরোলেআউট হন :

    [view1 autoAlignAxis:ALAxisHorizontal toSameAxisOfView:view2];
    [view1 autoAlignAxis:ALAxisVertical toSameAxisOfView:view2];
  2. আপনি যদি কেবলমাত্র UIKit স্তরের অটোলেআউট পদ্ধতি ব্যবহার করেন:

    [view1 addConstraints:({
        @[ [NSLayoutConstraint
           constraintWithItem:view1
           attribute:NSLayoutAttributeCenterX
           relatedBy:NSLayoutRelationEqual
           toItem:view2
           attribute:NSLayoutAttributeCenterX
           multiplier:1.f constant:0.f],
    
           [NSLayoutConstraint
            constraintWithItem:view1
            attribute:NSLayoutAttributeCenterY
            relatedBy:NSLayoutRelationEqual
            toItem:view2
            attribute:NSLayoutAttributeCenterY
            multiplier:1.f constant:0.f] ];
    })];

2. অটোলেয়া ছাড়া:

আমি পছন্দ করি:

UIView *parentView, *childView;
[childView setFrame:({
    CGRect frame = childView.frame;

    frame.origin.x = (parentView.frame.size.width - frame.size.width) / 2.0;
    frame.origin.y = (parentView.frame.size.height - frame.size.height) / 2.0;

    CGRectIntegral(frame);
})];

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

1
যদি আমি ভুল না হয়ে যাই, চাইল্ড.ফ্রেমে = সিজিআরেক্টইন্টেগ্রাল (চাইল্ড.ফ্রেমে); বিএল বর্ণিত সমস্যার সমাধান যে কোনও জায়গায় ক্যাচ-অল / ব্যবহারের এক দুর্দান্ত ধরণ।
ফ্যাটি

1
@ জো ব্লো: মাথা উঁচু করার জন্য ধন্যবাদ। আমি রাউন্ডিং পছন্দ করতাম তবে ব্লক স্টাইলের সাথে এটি ব্যবহার করা আরও মার্জিতCGRectIntegral
সেমাল একার

ফ্রেম সেট করতে আপনি যে সিনট্যাক্সটি ব্যবহার করেছেন তা ব্যাখ্যা করতে পারতেন, আমি এটি আগে দেখিনি। সম্পত্তিতে বরাদ্দ করা "বন্ধ" এর সর্বশেষ বিবৃতিটি কি সর্বদা? এবং আমি এটি অ্যাপল ডক্সে কোথায় খুঁজে পাব?
জোহানেস

"আপনি যদি কেবলমাত্র UIKit স্তরের অটোলেআউট পদ্ধতিগুলি ব্যবহার করেন:" ত্রুটিগুলির ফলাফল।
জনি

13

সহজতম পথ:

child.center = parent.center

আমার অর্থ হ'ল আপনার কীভাবে এটি কাজ করে তার আরও ব্যাখ্যা / বিবরণ যুক্ত করা উচিত।
তুষার

এই ধরণের অনেক উত্তর অনুসন্ধান করা হয়েছে, এই সাধারণটি আমার জন্য কৌশলটি করেছে। ধন্যবাদ।
gbossa

9

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

এই অভ্যন্তরীণ দৃশ্যে এই অটোরিসাইজিং মাস্কটি সেট করুন।


1
অটোলেআউট সহ, কোনও অটোসাইজিং উইন্ডো নেই।
অ্যালেন

আপনি যদি অটোরসাইজিং ব্যবহার করতে চান তবে @ অ্যালেন আপনাকে অটোলেআউট অক্ষম করতে হবে।
মায়াঙ্ক জৈন

8

আইওএস 9 এর সাহায্যে আপনি লেআউট অ্যাঙ্কর এপিআই ব্যবহার করতে পারেন।

কোডটি এর মতো দেখায়:

childview.centerXAnchor.constraintEqualToAnchor(parentView.centerXAnchor).active = true
childview.centerYAnchor.constraintEqualToAnchor(parentView.centerYAnchor).active = true

এই উপর থেকে সুবিধা আদায় করে CGPointMakeঅথবা CGRectসেই পদ্ধতি সঙ্গে আপনি একটি ধ্রুবক দেখার কেন্দ্রে স্থাপন করা হয় কিন্তু এই কৌশল নিয়ে আপনাকে দুটি মতামত চিরকাল রাখা হবে, কোন ব্যাপার কিভাবে মধ্যে একটি সম্পর্ক স্থাপনের হয় parentviewপরিবর্তন।

আপনি এটি করার আগে নিশ্চিত হন:

        self.view.addSubview(parentView)
        self.view.addSubView(chidview)

এবং translatesAutoresizingMaskIntoConstraintsপ্রতিটি মতামতের জন্য মিথ্যাতে সেট করা ।

এটি ক্রাশ হওয়া এবং অটোলআউটটিকে হস্তক্ষেপ থেকে রোধ করবে।


8

তুমি ব্যবহার করতে পার

yourView.center = CGPointMake(CGRectGetMidX(superview.bounds), CGRectGetMidY(superview.bounds))

এবং সুইফটে 3.0

yourView.center = CGPoint(x: superview.bounds.midX, y: superview.bounds.midY)

1
দ্বিতীয় কোড উদাহরণটি পুরোপুরি দ্রুত 4 এ কাজ করে work গ্রেট 👍🏻!
iGhost

হ্যাঁ! ধন্যবাদ, অবশেষে। এই মিডএক্স / মিডওয়াই জিনিসটি সম্পর্কে জানতেন না। Perfecto থেকে।
ডেভ ওয়াই

5

ভিউ এবং সাবভিউতে একই কেন্দ্র ব্যবহার করা এটি করার সহজ উপায়। আপনি এরকম কিছু করতে পারেন,

UIView *innerView = ....;
innerView.view.center = self.view.center;
[self.view addSubView:innerView];

এটি দৃশ্যের অতি দৃশ্যের সাথে সাব ভিউটিকে কেন্দ্র করে। উপরের ক্ষেত্রে এটি কাজ করছে কারণ উত্সটি (0, 0) এ রয়েছে।
আব্দুররহমান মুবেন আলী

3

PureLayout ব্যবহারের সাথে আর একটি সমাধান autoCenterInSuperview

// ...
UIView *innerView = [UIView newAutoLayoutView];
innerView.backgroundColor = [UIColor greenColor];
[innerView autoSetDimensionsToSize:CGSizeMake(100, 30)];

[outerview addSubview:innerView];

[innerView autoCenterInSuperview];

এটি দেখতে এটির মতো দেখাচ্ছে:

পিওরলাইআউট সহ কেন্দ্র


2

সি # বা জ্যামারিন.আইওএস এ আমরা এটি ব্যবহার করতে পারি

ইমেজভিউ.সেন্টার = নতুন সিজিপিয়েন্ট (টেম্প ভিউ.ফ্রেম.সাইজ.উইথ / 2, টেম্প ভিউ.ফ্রেম.সাইজ.হাইট / 2);


1

আমি ব্যবহার করব:

child.center = CGPointMake(parent.bounds.height / 2, parent.bounds.width / 2)

এটি সহজ, সংক্ষিপ্ত এবং মিষ্টি। আপনি যদি উপরে @ হেজাজির উত্তর ব্যবহার করেন এবং আপনার মতামত parent.centerব্যতীত অন্য কোনও কিছুতে সেট করা থাকে (0,0)তবে কেন্দ্রিক হবে না!


0
func callAlertView() {

    UIView.animate(withDuration: 0, animations: {
        let H = self.view.frame.height * 0.4
        let W = self.view.frame.width * 0.9
        let X = self.view.bounds.midX - (W/2)
        let Y = self.view.bounds.midY - (H/2)
        self.alertView.frame = CGRect(x:X, y: Y, width: W, height: H)
        self.alertView.layer.borderWidth = 1
        self.alertView.layer.borderColor = UIColor.red.cgColor
        self.alertView.layer.cornerRadius = 16
        self.alertView.layer.masksToBounds = true
        self.view.addSubview(self.alertView)

    })


}// calculation works adjust H and W according to your requirement
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.