मेरे पास कुछ UIButtons हैं, और IB में वे पहलू फिट पर सेट हैं, लेकिन किसी कारण से वे हमेशा खींच रहे हैं। क्या आपको कुछ और सेट करना है? मैंने सभी अलग-अलग व्यू मोड की कोशिश की और उनमें से कोई भी काम नहीं करता, वे सभी खिंचाव करते हैं।
मेरे पास कुछ UIButtons हैं, और IB में वे पहलू फिट पर सेट हैं, लेकिन किसी कारण से वे हमेशा खींच रहे हैं। क्या आपको कुछ और सेट करना है? मैंने सभी अलग-अलग व्यू मोड की कोशिश की और उनमें से कोई भी काम नहीं करता, वे सभी खिंचाव करते हैं।
जवाबों:
मुझे वह समस्या पहले भी हो चुकी है। मैंने इसे अपनी छवि को एक में डालकर हल किया UIImageView
, जहां contentMode
सेटिंग्स वास्तव में काम करती हैं, और UIButton
उस के ऊपर एक पारदर्शी कस्टम लगा रही हैं ।
EDIT: यह उत्तर अप्रचलित है। IOS के आधुनिक संस्करणों में सही उत्तर के लिए @Werner Altewischer का उत्तर देखें ।
का समाधान संपत्ति contentMode
पर सेट करना imageView
है UIButton
। UIButton
(अन्यथा यह मेरा मानना है कि काम करने के लिए के लिए कस्टम प्रकार के साथ निर्मित होता है nil
इस संपत्ति के लिए दिया जाता है)।
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
यह विधि मेरे लिए बहुत अच्छा काम करती है।
में xib बटन और सेट का चयन करें user defined runtime attributes
:
self.imageView.contentMode
Number
1
हम संख्या का उपयोग करते हैं क्योंकि आप वहां enum का उपयोग नहीं कर सकते। लेकिन UIViewContentModeScaleAspectFit 1 के बराबर है।
extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
imageView.contentMode
ने मेरे लिए काम किया!
सामग्री के लिए बटन का उपयोग करें ImageView सामग्री। सीधे बटन पर ही नहीं।
homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];
यदि आप छवि UIImageView
को बटन के पीछे रखते हैं, तो आप UIButton
कक्षा की अंतर्निहित कार्यक्षमता को ढीला कर देंगे , जैसे कि adjustsImageWhenHighlighted
और adjustsImageWhenDisabled
, और निश्चित रूप से अलग-अलग राज्यों के लिए अलग-अलग छवियां सेट करने की क्षमता (यह खुद करने की ललक के बिना)।
यदि हम सभी नियंत्रण अवस्थाओं के लिए एक छवि खोलना चाहते हैं , तो एक approuch का उपयोग करके छवि प्राप्त करना है imageWithCGImage:scale:orientation
, जैसा कि निम्नलिखित विधि में है:
- (UIImage *) getScaledImage:(UIImage *)img insideButton:(UIButton *)btn {
// Check which dimension (width or height) to pay respect to and
// calculate the scale factor
CGFloat imgRatio = img.size.width / img.size.height,
btnRatio = btn.frame.size.width / btn.frame.size.height,
scaleFactor = (imgRatio > btnRatio
? img.size.width / btn.frame.size.width
: img.size.height / btn.frame.size.height;
// Create image using scale factor
UIImage *scaledImg = [UIImage imageWithCGImage:[img CGImage]
scale:scaleFactor
orientation:UIImageOrientationUp];
return scaledImg;
}
इसे लागू करने के लिए हम लिखेंगे:
UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn];
[myBtn setImage:scaledImg forState:UIControlStateNormal];
यह सभी नियंत्रण राज्यों में छवि को फैलने से रोकना चाहिए। यह मेरे लिए काम किया है, लेकिन मुझे पता है अगर यह नहीं करता है!
नोट: यहां हम एक समस्या से संबंधित है UIButton
, लेकिनinsideButton:
जैसा भी हो insideView:
, या जो कोई भी छवि में फिट करना चाहेगा।
मुझे कुछ समय पहले यह समस्या हुई थी। मेरे पास जो मुद्दा था, मैं इस आशय की पृष्ठभूमि UIButton पर लागू करने की कोशिश कर रहा था जो कि सीमित है और इसलिए इसका मतलब है कि आप इसे आसानी से समायोजित नहीं कर सकते।
चाल सिर्फ एक छवि के रूप में सेट करने के लिए है तो @ ayreguitar की तकनीक को लागू करें और इसे ठीक करना चाहिए!
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
एक ही समाधान में कुछ अलग-अलग उत्तरों को एक साथ जोड़कर - एक कस्टम प्रकार के साथ एक बटन बनाएं, बटन की छवि दृश्य सामग्री सेट करें संपत्ति, और बटन के लिए छवि सेट करें (पृष्ठभूमि छवि नहीं, जो अभी भी भरने के लिए पैमाने पर होगी)।
//Objective-C:
UIImage *image = [UIImage imageNamed:"myImageName.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
//Swift:
let image = UIImage(named: "myImageName.png")
let button = UIButton(type: .custom)
button.imageView?.contentMode = .scaleAspectFit
button.setImage(image, for: .normal)
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
यह उत्तर @ WernerAltewischer के उत्तर पर आधारित है ।
इस पर कोड निष्पादित करने के लिए एक IBOutlet से मेरे बटन को जोड़ने से बचने के लिए, मैंने UIButton की कक्षा को उप-वर्गित किया:
// .h
@interface UIButtonWithImageAspectFit : UIButton
@end
// .m
@implementation UIButtonWithImageAspectFit
- (void) awakeFromNib {
[self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
@end
अब अपने xib में एक कस्टम बटन बनाएं, और उसकी छवि सेट करें (पृष्ठभूमि छवि नहीं):
फिर, इसकी कक्षा निर्धारित करें:
हो गया!
आपके बटन के
बजाय
छवि का पहलू अब अपेक्षित है:
ios 12. आपको सामग्री संरेखण को भी जोड़ना होगा
class FitButton: UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
self.imageView?.contentMode = .scaleAspectFill
self.contentHorizontalAlignment = .fill
self.contentVerticalAlignment = .fill
super.layoutSubviews()
}
}
UIView कंटेंट मोड्स संबंधित CALayer के "कंटेंट" पर लागू होते हैं। यह UIImageView
s के लिए काम करता है क्योंकि वे CALayer
सामग्री को संबंधित पर सेट करते हैं CGImage
।
drawRect:
अंत में परत सामग्री को प्रदान करता है।
एक कस्टम UIButton
(जहां तक मुझे पता है) की कोई सामग्री नहीं है (सामग्री का उपयोग करके गोल-रेक्ट स्टाइल बटन को प्रस्तुत किया जा सकता है)। बटन में साक्षात्कार होते हैं: पृष्ठभूमि UIImageView
, छवि UIImageView
और शीर्षक UILabel
। contentMode
सबव्यू पर सेट करना आप जो चाहते हैं वह कर सकते हैं, लेकिन UIButton
दृश्य पदानुक्रम के साथ खिलवाड़ करना थोड़ा नहीं के बराबर है।
बदलना UIButton.imageView.contentMode
मेरे लिए काम नहीं करता।
मैंने इमेज को 'बैकग्राउंड' प्रॉपर्टी में सेट करके समस्या हल की।
जरूरत पड़ने पर आप अनुपात की कमी जोड़ सकते हैं
यह कई अन्य उत्तरों को ओवरलैप करता है, लेकिन मेरे लिए समाधान था
contentMode
के UIImageView
लिए सेट .ScaleAspectFit
- जो या तो "यूजर डिफाइंड रनटाइम अटेंशन" में किया जा सकता है इंटरफ़ेस बिल्डर (यानी self.imageView.contentMode
; नंबर, 1) या एक UIButton
उपवर्ग में;@ गिलुय्यूम के समान, मैंने स्विफ्ट-फाइल के रूप में यूबूटन का उपवर्ग बनाया है। फिर इंटरफ़ेस बिल्डर में मेरी कस्टम क्लास सेट करें:
और यहां स्विफ्ट फ़ाइल:
import UIKit
class TRAspectButton : UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.imageView?.contentMode = .ScaleAspectFit
}
}
मेरे पास एक ही मुद्दा था, लेकिन मैं इसे काम करने के लिए नहीं मिला (शायद यह एसडीके के साथ एक बग है)।
आखिरकार, वर्कअराउंड के रूप में, मैंने UIImageView
अपने बटन के पीछे रखा और उन विकल्पों को सेट किया जो मैं चाहता था, फिर बस उसके UIButton
ऊपर एक रिक्त स्थान रखा ।