UIButton की छवि को कैसे समायोजित करें?


158

मैं UIButton की छवि का आकार कैसे समायोजित कर सकता हूं? मैं इस तरह से चित्र सेट कर रहा हूँ:

[myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];

हालाँकि यह छवि को पूर्ण बटन तक भर देता है, मैं छवि को छोटा कैसे करूं?


6
क्या आपने छवि को छोटा (LOL) बनाने की कोशिश की है?
कोडिया

1
@ कोडाफाई सही है, आपको आम तौर पर सही आकार में संपत्ति प्रदान करनी चाहिए क्योंकि यह सीपीयू के लिए किसी भी काम को कम कर देता है, कम मेमोरी का उपयोग करता है और सबसे अधिक संभावना
दिखेगी

इसके अलावा, आप बटन को छवि के आकार (या इसके विपरीत) के लिए बना सकते हैं। आपके पास एक बड़ा बटन क्यों है ... इसमें एक छोटी छवि के साथ। आसानी से आप चाहते हैं कि छवि को जोड़ दें, जो कि कस्टम बटन के लिए या आप कर सकते हैं जो तर्क आप दूसरों के लिए लागू करना चाहते हैं उसे स्पष्ट रूप से समझाइए।
अभिषेक सिंह

जवाबों:


243

यदि मैं सही ढंग से समझता हूं कि आप क्या करने की कोशिश कर रहे हैं, तो आपको बटन छवि किनारे इनसेट के साथ खेलने की आवश्यकता है। कुछ इस तरह:

myLikesButton.imageEdgeInsets = UIEdgeInsets(top, left, bottom, right)

96

टिम का जवाब सही है, हालांकि मैं एक और सुझाव जोड़ना चाहता था, क्योंकि मेरे मामले में पूरी तरह से एक सरल समाधान था।

मैं UIButtonइमेज इनसेट सेट करना चाह रहा था क्योंकि मुझे महसूस नहीं हुआ था कि मैं बटन पर कंटेंट मोड सेट कर सकता हूं UIImageView, जिससे UIEdgeInsets और हार्ड-कोडेड वैल्यू को पूरी तरह से उपयोग करने की आवश्यकता नहीं होगी। बस बटन पर अंतर्निहित चित्र को एक्सेस करें और सामग्री मोड सेट करें:

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;

देखें UIButton कंटेंट मोड सेटिंग को नहीं सुनता है?

स्विफ्ट 3

myButton.imageView?.contentMode = .scaleAspectFit

1
बैकग्राउंड के लिए समान कैसे करें?
सर्गेई सहकानन

myButton.backgroundImageView? .contentMode = .scaleAspectFit
Andrea.Ferrando

@ Andrea.Ferrando button.backgroundImageView.contentModeकाम नहीं करता है
Seong Lee

अपने आप को कुछ समय बचाएं और सुनिश्चित करें कि आप छवि सेट कर रहे हैं पृष्ठभूमि छवि नहीं! @SeongLee सही है आप सामग्री के साथ पृष्ठभूमि की छवि में हेरफेर नहीं कर सकते हैंमॉड या एजइंटरट
redPanda

42

स्विफ्ट 3:

button.setImage(UIImage(named: "checkmark_white"), for: .normal)
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)

6
इसने मेरे लिए खूबसूरती से काम किया। मैंने इंकस्केप के भीतर एक पीडीएफ आइकन बनाया और contentVerticalAlignment/contentHorizontalAlignmentविकल्पों ने मुझे उस तरह से स्केल करने में सक्षम किया जैसा मैं उम्मीद कर रहा था। इसे पोस्ट करने के लिए आपका धन्यवाद।
एड्रियन

2
सेटिंग contentHorizontalAlignmentऔर contentVerticalAlignmentचाल
चली

1
आइकन के लिए पीडीएफ एसेट्स का उपयोग करते समय यह समाधान बहुत अच्छा काम करता है। धन्यवाद!
एनको अलोंसो


26

यदि आपकी छवि बहुत बड़ी है (और आप छवि को छोटा नहीं कर सकते / नहीं करना चाहते), तो पहले दो उत्तरों का एक संयोजन बहुत अच्छा काम करता है।

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(15.0, 15.0, 15.0, 5.0)

जब तक आपको इमेज इंसेटिव्स सही नहीं मिलेंगे, तब तक इमेज को बिना बदले तिरछा किया जाएगा contentMode


23

आप imageEdgeInsetsबटन की छवि के चारों ओर आयत के लिए इनसेट या आउटसेट मार्जिन का उपयोग कर सकते हैं ।

 [self.btn setImageEdgeInsets:UIEdgeInsetsMake(6, 6, 6, 6)];

एक सकारात्मक मूल्य सिकुड़ता है, या इनसेट करता है, वह बढ़त-चलती है। एक नकारात्मक मान का विस्तार होता है, या बाहरी, वह बढ़त।


17

यहाँ UIButton के imageView पैमाने पर करने के लिए अन्य समाधान है।

button.imageView?.layer.transform = CATransform3DMakeScale(0.8, 0.8, 0.8)

आपने मेरा दिन बचाया। मैं बस एक बटन के अंदर अपनी छवि को स्केल करना चाहता था। नो इनसेट्स नो नथिंग, थैंक्स!
पेड्रो एंटोनियो

15

हेफ्ट्स द स्विफ्ट संस्करण:

myButton.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

8

स्विफ्ट 4

आपको इस विशिष्ट क्रम में, कोड की इन दो पंक्तियों का उपयोग करने की आवश्यकता होगी। आपको केवल किनारे के इनसेट के ऊपर और नीचे के मूल्य को बदलना है।

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)

EXC_BAD_ACCESSजब कहा जाता है तो ये त्रुटि हुई override func layoutSubviews()
एंड्रयू कर्ण

7

टिम सी के जवाब की मदद से , मैं UIButtonस्विफ्ट का उपयोग करने पर एक एक्सटेंशन बनाने में सक्षम था जो आपको .setImage()अतिरिक्त frameपैरामीटर के साथ फ़ंक्शन का उपयोग करके छवि फ़्रेम को निर्दिष्ट करने की अनुमति देता है

extension UIButton{

    func setImage(image: UIImage?, inFrame frame: CGRect?, forState state: UIControlState){
        self.setImage(image, forState: state)

        if let frame = frame{
            self.imageEdgeInsets = UIEdgeInsets(
                top: frame.minY - self.frame.minY,
                left: frame.minX - self.frame.minX,
                bottom: self.frame.maxY - frame.maxY,
                right: self.frame.maxX - frame.maxX
            )
        }
    }

}

इस का उपयोग करते हुए, यदि आप एक के फ्रेम सेट करने के लिए चाहता था UIButtonकरने के लिए CGRectMake(0, 0, 64, 64), और करने के लिए इसे की छवि सेट myImageके एक फ्रेम के साथ CGRectMake(8, 8, 48, 48), आप इस्तेमाल कर सकते हैं

let button: UIButton = UIButton(frame: CGRectMake(0, 0, 64, 64))
button.setImage(
    myImage,
    inFrame: CGRectMake(8, 8, 48, 48),
    forState: UIControlState.Normal
)

4
आपको if letचेक करना चाहिए कि क्या frameहै nilऔर उसके बाद एक बार एक झटके पर जोर लगाना चाहिए ।
fpg1503

7

आइकन का आकार बदलते समय UIEdgeInsetsMake(top, left, bottom, right), बटन के आयाम और UIEdgeInsetsMake की क्षमता को ध्यान में रखते हुए नकारात्मक मानों के साथ काम करें, जैसे कि वे सकारात्मक हों।

उदाहरण: ऊंचाई 100 और पहलू 1: 1 के साथ दो बटन।

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)

यहां छवि विवरण दर्ज करें

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(45, 0, 45, 0)

यहां छवि विवरण दर्ज करें

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(60, 0, 60, 0)

यहां छवि विवरण दर्ज करें

उदाहरण 1 और 3 ABS के बाद से समान हैं (100 - (40 + 40)) = ABS (100 - (60 + 60))


2

स्विफ्ट 3

मैंने अपनी बिट्टन की चौड़ाई और ऊँचाई 40 तक निर्धारित की है और EdgeInsetsMake से मेरी पैडिंग 15 तरफ है। मैं वास्तविक पैडिंग देखने के लिए आपके बटन में एक पृष्ठभूमि रंग जोड़ने का सुझाव देता हूं।

myButton.backgroundColor = UIColor.gray // sample color to check padding
myButton.imageView?.contentMode = .scaleAspectFit
myButton.imageEdgeInsets = UIEdgeInsetsMake(15, 15, 15, 15)

2

एक दृष्टिकोण निम्नलिखित की तरह कोड में UIImage का आकार बदलना है। ध्यान दें: यह कोड केवल ऊँचाई से मापता है, लेकिन आप आसानी से फ़ंक्शन को चौड़ाई के अनुसार समायोजित कर सकते हैं।

let targetHeight = CGFloat(28)
let newImage = resizeImage(image: UIImage(named: "Image.png")!, targetHeight: targetHeight)
button.setImage(newImage, for: .normal)

fileprivate func resizeImage(image: UIImage, targetHeight: CGFloat) -> UIImage {
    // Get current image size
    let size = image.size

    // Compute scaled, new size
    let heightRatio = targetHeight / size.height
    let newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
    let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)

    // Create new image
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
    image.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    // Return new image
    return newImage!
}

2

स्विफ्ट> 5 के लिए अपडेट किया गया

आकार सेट करें:

button.frame = CGRect(x: 0, y: 0, width: 44, height: 44)

मार्जिन निर्धारित करें:

button.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

1

स्विफ्ट 3 के लिए अपडेट किया गया

yourButtonName.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)

-6

मुझे लगता है, आपकी छवि का आकार भी बटन आकार के समान है, तो आप छवि को बटन की पृष्ठभूमि में रखते हैं जैसे:

[myLikesButton setBackgroundImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];

आप छवि और बटन के एक ही आकार के स्वामी हैं। मुझे आशा है कि आप मेरी बात को समझेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.