আমি এই পার্টিতে কিছুটা দেরি করেছি, তবে আমার কাছে যুক্ত করার মতো কিছু দরকারী আছে বলে আমি মনে করি।
কেকোয়ার উত্তর দুর্দান্ত তবে রনলগের উল্লেখ অনুসারে, এটি বোতামটিকে আর সম্মান sizeToFit
করতে পারে না বা আরও গুরুত্বপূর্ণ, এটি অভ্যন্তরীণ আকারের হয়ে গেলে বোতামটি তার সামগ্রীটি ক্লিপ করতে পারে। বাবা!
প্রথম, যদিও,
আমি কীভাবে বিশ্বাস করি imageEdgeInsets
এবং কীভাবে titleEdgeInsets
কাজ করি তার একটি সংক্ষিপ্ত বিবরণ :
এর জন্য দস্তাবেজimageEdgeInsets
অংশে নিম্নলিখিত বলার আছে:
বোতামের চিত্রের জন্য কার্যকর অঙ্কন আয়তক্ষেত্রটি পুনরায় আকার দিতে এবং পুনরায় স্থাপন করতে এই সম্পত্তিটি ব্যবহার করুন। আপনি চারটি ইনসেটের (উপরে, বাম, নীচে, ডানদিকে) আলাদা আলাদা মান নির্দিষ্ট করতে পারবেন। একটি ধনাত্মক মান সঙ্কুচিত হয়, বা পোকামাকড়, যে প্রান্তটি it এটিকে বোতামের কেন্দ্রের নিকটে চলে যায়। একটি নেতিবাচক মান প্রসারিত হয়, বা আউটসেটগুলি, যে প্রান্তটি।
আমি বিশ্বাস করি যে এই ডকুমেন্টেশনটি কল্পনা করেই লেখা হয়েছিল যে বোতামটির কোনও শিরোনাম নেই, কেবল একটি চিত্র। এটি এইভাবে অনেক বেশি ধারণা দেয় এবং UIEdgeInsets
সাধারণত কীভাবে আচরণ করে তা আচরণ করে । মূলত, ইমেজের ফ্রেমটি (বা শিরোনাম, সহ titleEdgeInsets
) ইতিবাচক ইনসেটের জন্য এবং নেতিবাচক পোকামাকড়গুলির জন্য বাইরের দিকে সরানো হয়।
ঠিক আছে, তাই কি?
আমি সেখানে যাচ্ছি! আপনার একটি ডিফল্টরূপে যা আছে তা এখানে একটি চিত্র এবং একটি শিরোনাম সেট করে (বোতামের সীমানাটি যেখানে রয়েছে তা দেখানোর জন্য সবুজ)):
আপনি যখন কোনও চিত্র এবং শিরোনামের মধ্যে ফাঁক করে দিতে চান, উভয়ই ক্রাশ হওয়ার কারণ না রেখে, আপনাকে চারটি আলাদা আলাদা ইনসেট স্থাপন করতে হবে, প্রতিটি চিত্র এবং শিরোনামের জন্য দুটি সেট করতে হবে। এর কারণ আপনি এই উপাদানগুলির ফ্রেমের আকারগুলি পরিবর্তন করতে চান না , কেবল তাদের অবস্থানগুলি। আপনি যখন এইভাবে চিন্তা শুরু করেন, কেকোয়ার দুর্দান্ত বিভাগে প্রয়োজনীয় পরিবর্তনটি স্পষ্ট হয়ে ওঠে:
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
}
@end
তবে অপেক্ষা করুন , আপনি বলবেন, আমি যখন এটি করি তখন আমি এটি পাই:
ও আচ্ছা! আমি ভুলে গেছি, ডক্স আমাকে এ সম্পর্কে সতর্ক করেছে। তারা বলে, অংশে:
এই বৈশিষ্ট্যটি কেবল বিন্যাসের সময় চিত্রের অবস্থানের জন্য ব্যবহৃত হয়। বোতামটি এই সম্পত্তিটি নির্ধারণ করতে intrinsicContentSize
এবং ব্যবহার করে না sizeThatFits:
।
কিন্তু হয় একটি সম্পত্তি যে করতে পারেন সাহায্য, এবং যে এর contentEdgeInsets
। এর জন্য দস্তাবেজগুলি অংশ হিসাবে বলে:
বোতামটি এই সম্পত্তিটি নির্ধারণ করতে intrinsicContentSize
এবং ব্যবহার করে sizeThatFits:
।
ভাল লাগছে। সুতরাং আরও একবার এই বিভাগটি টুইট:
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
self.contentEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, insetAmount);
}
@end
এবং আপনি কি পেতে পারি?
আমার কাছে বিজয়ী মনে হচ্ছে।
সুইফটে কাজ করছেন এবং আদৌ কোনও চিন্তাভাবনা করতে চান না? সুইফটে এক্সটেনশনের চূড়ান্ত সংস্করণটি এখানে:
extension UIButton {
func centerTextAndImage(spacing: CGFloat) {
let insetAmount = spacing / 2
imageEdgeInsets = UIEdgeInsets(top: 0, left: -insetAmount, bottom: 0, right: insetAmount)
titleEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: -insetAmount)
contentEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: insetAmount)
}
}