मुझे इस पार्टी में थोड़ी देर हो गई है, लेकिन मुझे लगता है कि मुझे जोड़ने के लिए कुछ उपयोगी है।
केकोआ का जवाब बहुत अच्छा है लेकिन, जैसा कि रॉनलुग ने उल्लेख किया है, यह बटन को अब सम्मान नहीं दे सकता है sizeToFit
या इससे भी महत्वपूर्ण बात यह है कि बटन को इसकी सामग्री को क्लिप करने का कारण बन सकता है जब यह आंतरिक रूप से आकार का होता है। ओह!
हालांकि, पहले,
मेरा विश्वास imageEdgeInsets
और titleEdgeInsets
काम करने का संक्षिप्त विवरण :
के लिये दस्तावेजimageEdgeInsets
भाग में, निम्नलिखित में क्या कहना है:
बटन छवि के लिए प्रभावी ड्राइंग आयत का आकार बदलने और बदलने के लिए इस संपत्ति का उपयोग करें। आप चार इनसेट्स (ऊपर, बाएं, नीचे, दाएं) में से प्रत्येक के लिए एक अलग मूल्य निर्दिष्ट कर सकते हैं। एक सकारात्मक मूल्य सिकुड़ता है, या इनसेट करता है, वह किनारा-इसे बटन के केंद्र के करीब ले जाता है। एक नकारात्मक मान विस्तृत होता है, या बाहरी, वह किनारा।
मेरा मानना है कि यह दस्तावेज यह कल्पना करते हुए लिखा गया था कि बटन का कोई शीर्षक नहीं है, बस एक छवि है। यह इस तरह से बहुत अधिक समझ में आता है, और व्यवहार करता है कि 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)
}
}