ios - Autolayout-UIButton অন্তর্নিহিত আকার শিরোনাম insets অন্তর্ভুক্ত করা হয় না




cocoa-touch uiview (8)

যদি আমার আইআইবুতনটি অটলআউট ব্যবহার করে সাজানো থাকে, তবে এর আকারটি তার সামগ্রী মাপসই করার জন্য সুন্দরভাবে সমন্বয় করে।

আমি যদি button.image রূপে একটি চিত্র সেট করি, তবে ইনস্ট্রিন্সিক আকারটি আবার এইটার জন্য মনে হয়।

যাইহোক, যদি আমি বোতামের শিরোনাম titleEdgeInsets করি, তবে লেআউটটি এর জন্য অ্যাকাউন্ট করে না এবং পরিবর্তে বোতামের শিরোনামটি ছিন্ন করে।

আমি কীভাবে নিশ্চিত করতে পারি যে বাটনটির অভ্যন্তরীণ প্রস্থটি অন্তরকের জন্য অ্যাকাউন্ট করে?

সম্পাদনা:

আমি নিম্নলিখিত ব্যবহার করছি:

[self.backButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];

লক্ষ্য ইমেজ এবং টেক্সট মধ্যে কিছু বিচ্ছেদ যোগ করা হয়।


আপনি এটি নেতিবাচক এবং ইতিবাচক শিরোনাম এবং সামগ্রী ইনসেটগুলির সমন্বয় ব্যবহার করে ইন্টারফেস নির্মাতার (কোনও কোড লেখার জন্য) কাজ করতে পারেন।

আপডেট করুন : এক্সকোড 7 এ একটি বাগ রয়েছে যেখানে আপনি Right ইনসেট ক্ষেত্রের নেতিবাচক মানগুলি প্রবেশ করতে পারবেন না, তবে মানটি হ্রাস করার জন্য এটির পাশে স্টেপার নিয়ন্ত্রণ ব্যবহার করতে পারেন। (ধন্যবাদ স্টুয়ার্ট)

এই কাজটি ইমেজ এবং শিরোনামের মধ্যে দূরত্বের 8pt যোগ করবে এবং একই পরিমাণে বাটনটির অভ্যন্তরীণ প্রস্থ বৃদ্ধি করবে। এটার মত:


আপনি কিভাবে ইনসেট সেট করছেন তা নির্দিষ্ট করে নি, তাই আমি অনুমান করছি যে আপনি titleEdgeInsets ব্যবহার করছেন কারণ আমি একই রকম প্রভাব দেখতে পাচ্ছি। যদি আমি ContentEdgeInsets ব্যবহার করি তবে এটি সঠিকভাবে কাজ করে।

- (IBAction)ChangeTitle:(UIButton *)sender {
    self.button.contentEdgeInsets = UIEdgeInsetsMake(0,20,0,20);
    [self.button setTitle:@"Long Long Title" forState:UIControlStateNormal];
}

আমি আমার UIButton আইকন এবং লেবেলের মধ্যে একটি 5pt স্পেস যোগ করতে চেয়েছিলেন। এইভাবে আমি এটি অর্জন করেছি:

UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeCustom];
// more button config etc
infoButton.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 5);
infoButton.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 0, -5);

ContentEdgeInsets, titleEdgeInsets এবং imageEdgeInsets এর সাথে সম্পর্কযুক্ত উপায়টি একটু দিতে এবং প্রতিটি অন্তর থেকে নেওয়া প্রয়োজন। তাই আপনি যদি শিরোনামের বামে কিছু ইনসেট যোগ করেন তবে আপনাকে ডানদিকে নেতিবাচক ইনসেট যুক্ত করতে হবে এবং সামগ্রীতে ডান দিকের আরো কিছু স্থান (একটি ইতিবাচক অন্তর দিয়ে) সরবরাহ করতে হবে।

শিরোনাম ইনসেটগুলি স্থানান্তরিত করার জন্য একটি সঠিক সামগ্রী ইনসেট যুক্ত করে আমার পাঠ্য বোতামের সীমানার বাইরে যায় না।


আমি যে সমাধানটি ব্যবহার করি তা হল বোতামে একটি প্রস্থ সংকোচ যুক্ত করা। তারপরে শুরুতে কোথাও আপনার পাঠ্য সেট করার পরে, প্রস্থ সীমাটি আপডেট করুন:

self.buttonWidthConstraint.constant = self.shareButton.intrinsicContentSize.width + 8;

যেখানে 8 আপনার অন্তর যাই হোক না কেন।


উপরে সব iOS 9+ এর জন্য কাজ করে নি, আমি যা করেছি তা হল:

  • একটি প্রস্থ সীমাবদ্ধতা যোগ করুন (বোতামটিতে কোন পাঠ্য নেই এমন সর্বনিম্ন প্রস্থের জন্য। পাঠ্য সরবরাহ করা হলে বোতামটি স্বয়ংক্রিয় স্কেল হবে)
  • বৃহত্তর চেয়ে সমান বা সমান সেট

এখন বোতামের চারপাশে একটি সীমানা যোগ করার জন্য পদ্ধতিটি ব্যবহার করুন:

button.contentEdgeInsets = UIEdgeInsetsMake(0,20,0,20);

এই থ্রেড একটু পুরানো, কিন্তু আমি শুধু এই মধ্যে দৌড়ে এবং একটি নেতিবাচক inset ব্যবহার করে এটি সমাধান করতে সক্ষম হয়েছিল। উদাহরণস্বরূপ, এখানে আপনার পছন্দসই প্যাডিং মানগুলি প্রতিস্থাপন করুন:

UIButton* myButton = [[UIButton alloc] init];
// setup some autolayout constraints here
myButton.titleEdgeInsets = UIEdgeInsetsMake(-desiredBottomPadding,
                                            -desiredRightPadding,
                                            -desiredTopPadding,
                                            -desiredLeftPadding);

সঠিক অটলআউট আউটসাইটগুলির সাথে একত্রিত, আপনি একটি চিত্র এবং পাঠ্য ধারণকারী একটি স্বয়ংক্রিয়-আকার পরিবর্তন বাটন দিয়ে শেষ! desiredLeftPadding সেট সঙ্গে নিচে দেখেন 10।

আপনি দেখতে পারেন যে বাটনটির প্রকৃত ফ্রেম লেবেলটি অন্তর্ভুক্ত করে না (যেহেতু লেবেলটি 10 ​​পয়েন্টকে ডানদিকে সীমানার বাইরে স্থানান্তরিত করে), তবে আমরা পাঠ্য এবং ছবির মধ্যে 10 টি প্যাডিং অর্জন করেছি।


কলিং সাইজToFit () নিশ্চিত করে যে ContentEdgeInset কার্যকর হয়

 extension UIButton {

              open override func draw(_ rect: CGRect) { 
                    self.contentEdgeInsets = UIEdgeInsets(top: 10,left: 40,bottom: 10,right: 40)
                    self.sizeToFit()
              }
           }

কেন UIView উপর intrinsicContentSize পদ্ধতি override না? উদাহরণ স্বরূপ:

- (CGSize) intrinsicContentSize
{
    CGSize s = [super intrinsicContentSize];

    return CGSizeMake(s.width + self.titleEdgeInsets.left + self.titleEdgeInsets.right,
                      s.height + self.titleEdgeInsets.top + self.titleEdgeInsets.bottom);
}

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





autolayout