আমার কয়েকটি ইউআইবিউটন রয়েছে এবং আইবিতে তারা এ্যাসপেক্ট ফিট সেট করেছে তবে কোনও কারণে তারা সর্বদা প্রসারিত। আপনার আর কিছু সেট করতে হবে? আমি সমস্ত ভিন্ন ভিউ মোড চেষ্টা করেছি এবং সেগুলির কোনওটিই কাজ করে না, তারা সব প্রসারিত করে।
আমার কয়েকটি ইউআইবিউটন রয়েছে এবং আইবিতে তারা এ্যাসপেক্ট ফিট সেট করেছে তবে কোনও কারণে তারা সর্বদা প্রসারিত। আপনার আর কিছু সেট করতে হবে? আমি সমস্ত ভিন্ন ভিউ মোড চেষ্টা করেছি এবং সেগুলির কোনওটিই কাজ করে না, তারা সব প্রসারিত করে।
উত্তর:
আমি আগে এই সমস্যা ছিল। আমি আমার ইমেজটি এ UIImageView
, যেখানে contentMode
সেটিংস প্রকৃতপক্ষে কাজ করে এবং UIButton
তার উপরে স্বচ্ছ রীতিনীতি রেখে এটি সমাধান করেছি।
সম্পাদনা: এই উত্তরটি অপ্রচলিত। আইওএসের আধুনিক সংস্করণগুলিতে সঠিক উত্তরের জন্য @ ওয়ার্নার অ্যালটিউইচারের উত্তর দেখুন ।
সমাধানটি সম্পত্তিটির contentMode
উপর সেট করা imageView
হয় UIButton
। UIButton
(অন্যথায় এই আমি বিশ্বাস করি কাজ করার জন্য কাস্টম ধরনের সঙ্গে তৈরি করা হয়েছে nil
এই সম্পত্তি জন্য ফিরিয়ে দেওয়া হয়)।
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
এই পদ্ধতিটি আমার জন্য খুব ভালভাবে কাজ করেছে:
ইন Xib বোতাম ও সেট নির্বাচন user defined runtime attributes
:
self.imageView.contentMode
Number
1
আমরা নম্বর ব্যবহার করি কারণ আপনি সেখানে এনাম ব্যবহার করতে পারবেন না। তবে ইউআইভিউ কনকন্টেন্টমডস্কেলএস্পেক্টফিটটি সমান।
extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
imageView.contentMode
আমার পক্ষে কাজ করেছেন!
কন্টেন্টমোডের জন্য বোতামের চিত্র দেখুন। সরাসরি বোতামে নয়।
homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];
আপনি যদি ছবিটির UIImageView
বোতামের পিছনে রাখেন , আপনি UIButton
শ্রেণীর অন্তর্নির্মিত কার্যকারিতা যেমন adjustsImageWhenHighlighted
এবং adjustsImageWhenDisabled
এবং অবশ্যই এবং বিভিন্ন রাজ্যের জন্য পৃথক চিত্র সেট করার ক্ষমতা (নিজেই এটি করার ঝামেলা ছাড়াই) আলগা করবেন।
আমরা যদি সমস্ত কন্ট্রোল স্টেটের জন্য কোনও চিত্র আনস্ট্রিচ করে রাখতে চাই 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 *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
এটি আমার পক্ষে কাজ করেছে
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
তার মন্তব্যের জন্য @ayreguitar ধন্যবাদ
কয়েকটি দ্রষ্টব্য হিসাবে কয়েকটি পৃথক উত্তর একত্রিত করে - একটি কাস্টম প্রকারের সাহায্যে একটি বোতাম তৈরি করুন, বোতামটির চিত্র দেখুন কনটেন্টমোড বৈশিষ্ট্য এবং বোতামটির জন্য চিত্রটি সেট করুন (পটভূমির চিত্র নয়, যা এখনও পূরণ করা যায়)।
//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;
এই উত্তরটি @ ওয়ার্নার আলটিউইসচারের উত্তরের ভিত্তিতে তৈরি ।
আইবিআউটলেটটিতে কোডটি চালানোর জন্য আমার বোতামটি সংযুক্ত হওয়া এড়াতে, আমি ইউআইবাটন ক্লাসটি সাবক্লাস করেছি:
// .h
@interface UIButtonWithImageAspectFit : UIButton
@end
// .m
@implementation UIButtonWithImageAspectFit
- (void) awakeFromNib {
[self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
@end
এখন আপনার এক্সিবায় একটি কাস্টম বোতাম তৈরি করুন এবং এর চিত্রটি সেট করুন (পটভূমির চিত্র নয়):
তারপরে, এর শ্রেণী নির্ধারণ করুন:
তুমি করেছ!
আপনার বোতামের চিত্রের
পরিবর্তে
এখন প্রত্যাশার মতো ফিট রয়েছে:
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()
}
}
ইউআইভিউ বিষয়বস্তু মোডগুলি সম্পর্কিত ক্যালায়ারের "সামগ্রীতে" প্রযোজ্য। এটি এর জন্য কাজ করে UIImageView
কারণ তারা CALayer
বিষয়বস্তুটিকে সংশ্লিষ্টটিতে সেট করে CGImage
।
drawRect:
শেষ পর্যন্ত স্তর বিষয়বস্তু রেন্ডার।
একটি কাস্টম UIButton
(যতদূর আমি জানি) এর কোনও সামগ্রী নেই (বৃত্তাকার-রেক্ট স্টাইল বোতামগুলি সামগ্রী ব্যবহার করে রেন্ডার করা যেতে পারে)। বাটনে সাবভিউ রয়েছে: পটভূমি UIImageView
, চিত্র UIImageView
এবং শিরোনাম UILabel
। contentMode
সাবউভিউগুলিতে সেট করা আপনার যা ইচ্ছা তা করতে পারে তবে UIButton
ভিউ হায়ারার্কির সাথে গোলমাল করা কিছুটা নয় no
পরিবর্তন UIButton.imageView.contentMode
আমার পক্ষে কাজ করে না।
আমি চিত্রটিকে 'ব্যাকগ্রাউন্ড' বৈশিষ্ট্যে সেট করে সমস্যার সমাধান করেছি।
আপনার প্রয়োজন হলে আপনি অনুপাত সীমাবদ্ধ করতে পারেন
এটি অন্যান্য অনেক উত্তরকে ওভারল্যাপ করে, তবে আমার জন্য সমাধানটি ছিল
contentMode
এর সেটটি সেট করুন - যা ইন্টারফেস বিল্ডারে (যেমন , সংখ্যা, 1) বা উপক্লাসে "ব্যবহারকারী সংজ্ঞায়িত রানটাইম বৈশিষ্ট্য" এ করা যেতে পারে ;UIImageView
.ScaleAspectFit
self.imageView.contentMode
UIButton
@ গুইলাউমের মতো, আমি সুইফট-ফাইল হিসাবে ইউআইবুটনের একটি সাবক্লাস তৈরি করেছি। তারপরে ইন্টারফেস বিল্ডারে আমার কাস্টম ক্লাসটি সেট করুন:
এবং এখানে সুইফট ফাইল:
import UIKit
class TRAspectButton : UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.imageView?.contentMode = .ScaleAspectFit
}
}
আমার একই সমস্যা ছিল, তবে আমি এটি কাজ করতে পারিনি (সম্ভবত এটি এসডিকে দিয়ে একটি বাগ)।
অবশেষে, কর্মপরিকল্পনা হিসাবে, আমি UIImageView
আমার বোতামটির পিছনে একটি জায়গা রেখেছিলাম এবং আমার যে পছন্দগুলি পছন্দ হয়েছিল সেগুলি সেট করেছিলাম, তারপরে কেবল এর উপরে একটি ফাঁকা রেখেছি UIButton
।