ইউআইবাটন আইফোনে এ্যাসপেক্ট ফিট যাবে না


105

আমার কয়েকটি ইউআইবিউটন রয়েছে এবং আইবিতে তারা এ্যাসপেক্ট ফিট সেট করেছে তবে কোনও কারণে তারা সর্বদা প্রসারিত। আপনার আর কিছু সেট করতে হবে? আমি সমস্ত ভিন্ন ভিউ মোড চেষ্টা করেছি এবং সেগুলির কোনওটিই কাজ করে না, তারা সব প্রসারিত করে।


@ ওয়ার্নার আলটেসিশারের উত্তরটি সঠিক। যথাযথ পরিবর্তন করুন।
হর্ষিত গুপ্ত

1
@ মার্টি আপনি পটভূমি চিত্র বা চিত্র সেট করছেন? পটভূমি চিত্র এটি সমর্থন করে না, কেবল চিত্র।
জুয়ান বোয়েরো

উত্তর:


45

আমি আগে এই সমস্যা ছিল। আমি আমার ইমেজটি এ UIImageView, যেখানে contentModeসেটিংস প্রকৃতপক্ষে কাজ করে এবং UIButtonতার উপরে স্বচ্ছ রীতিনীতি রেখে এটি সমাধান করেছি।

সম্পাদনা: এই উত্তরটি অপ্রচলিত। আইওএসের আধুনিক সংস্করণগুলিতে সঠিক উত্তরের জন্য @ ওয়ার্নার অ্যালটিউইচারের উত্তর দেখুন ।


হ্যাঁ যে চেষ্টা, কিন্তু এখন নয় ছবিতে মেরামত বাটন পেতে পারেন
Marty

আপনি এই কৌশলটি দিয়ে কীভাবে বোতামের রাজ্যগুলি পরিচালনা করবেন? "হাইলাইটেড" এর মতো ব্যবহারকারীর মিথস্ক্রিয়াকে প্রতিক্রিয়া জানানো দুঃস্বপ্ন বলে মনে হয়।
SooDesuNe

3
এই প্রশ্নের উত্তরের জন্য 2.5 বছর আগে এটি করার সঠিক উপায় হতে পারে তবে এখন আপনি ইউআইবাটনের অভ্যন্তরীণ ইমেজভিউ সম্পাদনা করতে এবং সেখানে সামগ্রী মোড সেট করতে পারেন। @ ওয়ার্নার আলটিউইচরের উত্তর দেখুন
স্টিভ হ্যালি

233

সমাধানটি সম্পত্তিটির contentModeউপর সেট করা imageViewহয় UIButtonUIButton(অন্যথায় এই আমি বিশ্বাস করি কাজ করার জন্য কাস্টম ধরনের সঙ্গে তৈরি করা হয়েছে nilএই সম্পত্তি জন্য ফিরিয়ে দেওয়া হয়)।


67
এটি আমার জন্য কাজ করেছে:[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
আয়রেগুইটার

2
এটি আমার পক্ষেও কাজ করে তবে আমি যদি আইজামওয়েনহাইলাইটলাইট = হ্যাঁ অ্যাডজাস্টস সেট করি তবে আমি বোতামটিতে আলতো চাপলে চিত্রটি আবার প্রসারিত হয়।
cduck

1
অ্যাডজাস্টস ইমেজ প্রসারিত আইওএস in-এ সরিয়ে দেওয়া হয়েছে
বেন ফ্লিন

3
আইওএস 8-এ, এটি আসলে আমার পক্ষে কাজ করে না। আসল উত্তর (স্বচ্ছ বোতামের পিছনে একটি চিত্র দেখার সাথে) সেরা কাজ করে।
ব্যবহারকারী 1416564

3
সুইফ্ট দু যাত্রায়:button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
নেস্টর

57

এই পদ্ধতিটি আমার জন্য খুব ভালভাবে কাজ করেছে:

ইন Xib বোতাম ও সেট নির্বাচন user defined runtime attributes:

  • মূল পথ: self.imageView.contentMode
  • টাইপ করুন: Number
  • মান: 1

আরও পরিষ্কারভাবে সমাধান দেখতে এখানে ক্লিক করুন

আমরা নম্বর ব্যবহার করি কারণ আপনি সেখানে এনাম ব্যবহার করতে পারবেন না। তবে ইউআইভিউ কনকন্টেন্টমডস্কেলএস্পেক্টফিটটি সমান।


2
এটি নকশাকালীন সময়ে ইন্টারফেস বিল্ডারের চিত্রও আপডেট করেছে। দুর্দান্ত সমাধান।
জর্জ ফিলিপোকোস

দুর্দান্ত সমাধান, কয়েকটি কোড এবং একটি কবজির মতো কাজ করে, এনামটি সামগ্রী মোড তালিকার আইটেমগুলির উপর ভিত্তি করে।
ক্রস

এটিকে কিছুটা সহজ করার জন্য আপনি একটি এক্সটেনশনও যুক্ত করতে পারেন: extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
ইয়োনাত

'সেলফ' ছাড়া imageView.contentModeআমার পক্ষে কাজ করেছেন!
জীবন

22

আপনি যদি ইন্টারফেস বিল্ডারে এটি করছেন, আপনি কোনও কোড ছাড়াই সরাসরি সেট করতে রানটাইম বৈশিষ্ট্য পরিদর্শক ব্যবহার করতে পারেন।

এক ধরণের "সংখ্যা" এবং "1" এর মান (বা আপনি যে কোনও মোডে চান) সহ "ইমেজভিউ.কন্টেন্টমড" হতে বাটনে আপনার মূল পথটি সেট করুন।

ইমেজভিউ.কন্টেন্টমোড = 1


14

কন্টেন্টমোডের জন্য বোতামের চিত্র দেখুন। সরাসরি বোতামে নয়।

homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];

6

আপনি যদি ছবিটির 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:বা যা কিছু চিত্রের সাথে মানিয়ে নিতে চায়।


6

কিছুক্ষণ আগে আমার এই সমস্যা হয়েছিল। আমার যে সমস্যাটি ছিল আমি হ'ল এই প্রভাবটি ইউআইবুটনের পটভূমিতে প্রয়োগ করার চেষ্টা করছিলাম যা সীমাবদ্ধ এবং এর অর্থ আপনি এটিকে সহজ হিসাবে সামঞ্জস্য করতে পারবেন না।

কৌশলটি এটিকে কেবল একটি চিত্র হিসাবে সেট করা হয় তবে @ আয়রগুইটারের কৌশলটি প্রয়োগ করুন এবং এটি ঠিক করা উচিত!

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];

4

এটি আমার পক্ষে কাজ করেছে

[button.imageView setContentMode:UIViewContentModeScaleAspectFit];

তার মন্তব্যের জন্য @ayreguitar ধন্যবাদ



4

কয়েকটি দ্রষ্টব্য হিসাবে কয়েকটি পৃথক উত্তর একত্রিত করে - একটি কাস্টম প্রকারের সাহায্যে একটি বোতাম তৈরি করুন, বোতামটির চিত্র দেখুন কনটেন্টমোড বৈশিষ্ট্য এবং বোতামটির জন্য চিত্রটি সেট করুন (পটভূমির চিত্র নয়, যা এখনও পূরণ করা যায়)।

//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)

3
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;

এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে, যদিও সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না। - পর্যালোচনা থেকে
ফেরিবিগ 18'16

2

এই উত্তরটি @ ওয়ার্নার আলটিউইসচারের উত্তরের ভিত্তিতে তৈরি ।

আইবিআউটলেটটিতে কোডটি চালানোর জন্য আমার বোতামটি সংযুক্ত হওয়া এড়াতে, আমি ইউআইবাটন ক্লাসটি সাবক্লাস করেছি:

// .h
@interface UIButtonWithImageAspectFit : UIButton
@end

// .m
@implementation UIButtonWithImageAspectFit

- (void) awakeFromNib {
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}

@end



এখন আপনার এক্সিবায় একটি কাস্টম বোতাম তৈরি করুন এবং এর চিত্রটি সেট করুন (পটভূমির চিত্র নয়):

UIButtonWithImageAspectFit: চিত্র তৈরি এবং সেট করুন


তারপরে, এর শ্রেণী নির্ধারণ করুন:

UIButtonWithImageAspectFit: কাস্টম ক্লাস সেট করুন

তুমি করেছ! আপনার বোতামের চিত্রের
পরিবর্তে
চিত্রের দিকটি ছাড়াই ইউআইবাটন fit
এখন প্রত্যাশার মতো ফিট রয়েছে:
চিত্রের দিকের সাথে ইউআইবাটনটি উপযুক্ত


2

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()


    }

}

1

চিত্রটি আনুপাতিকভাবে পুনরায় আকার না দেওয়ার সাথে আমার সমস্যা ছিল তাই আমি যেভাবে এটি স্থির করেছিলাম তা প্রান্তের ইনসেটগুলি ব্যবহার করছিল।

fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);

1

ইউআইভিউ বিষয়বস্তু মোডগুলি সম্পর্কিত ক্যালায়ারের "সামগ্রীতে" প্রযোজ্য। এটি এর জন্য কাজ করে UIImageViewকারণ তারা CALayerবিষয়বস্তুটিকে সংশ্লিষ্টটিতে সেট করে CGImage

drawRect: শেষ পর্যন্ত স্তর বিষয়বস্তু রেন্ডার।

একটি কাস্টম UIButton(যতদূর আমি জানি) এর কোনও সামগ্রী নেই (বৃত্তাকার-রেক্ট স্টাইল বোতামগুলি সামগ্রী ব্যবহার করে রেন্ডার করা যেতে পারে)। বাটনে সাবভিউ রয়েছে: পটভূমি UIImageView, চিত্র UIImageViewএবং শিরোনাম UILabelcontentModeসাবউভিউগুলিতে সেট করা আপনার যা ইচ্ছা তা করতে পারে তবে UIButtonভিউ হায়ারার্কির সাথে গোলমাল করা কিছুটা নয় no


1

পরিবর্তন UIButton.imageView.contentModeআমার পক্ষে কাজ করে না।
আমি চিত্রটিকে 'ব্যাকগ্রাউন্ড' বৈশিষ্ট্যে সেট করে সমস্যার সমাধান করেছি।
আপনার প্রয়োজন হলে আপনি অনুপাত সীমাবদ্ধ করতে পারেন


1

এটি অন্যান্য অনেক উত্তরকে ওভারল্যাপ করে, তবে আমার জন্য সমাধানটি ছিল

  • বোতামটির জন্য contentModeএর সেটটি সেট করুন - যা ইন্টারফেস বিল্ডারে (যেমন , সংখ্যা, 1) বা উপক্লাসে "ব্যবহারকারী সংজ্ঞায়িত রানটাইম বৈশিষ্ট্য" এ করা যেতে পারে ;UIImageView.ScaleAspectFitself.imageView.contentModeUIButton
  • "স্বয়ংক্রিয় আকারে পর্যালোচনা" অক্ষম করুন;
  • "ইনসেট" "এর জন্য" এজ "এবং উপযুক্ত" শীর্ষ "এবং" নীচে "মানগুলি সেট করুন (যা কেবল তখনই আপনার প্রয়োজন হতে পারে যদি আপনি চিত্র হিসাবে পিডিএফ ব্যবহার করেন)।

0

আপনি উপরের চিত্রের মতো চিত্রবিহীন সিজি চিত্র ব্যবহার করতে পারেন (তবে অনুপস্থিত বন্ধনী ছাড়াই)।

এছাড়াও ... কয়েক মিলিয়ন-নন-ফোন ফোন কোডটির সাথে মোটেও কাজ করবে না।



0

@ গুইলাউমের মতো, আমি সুইফট-ফাইল হিসাবে ইউআইবুটনের একটি সাবক্লাস তৈরি করেছি। তারপরে ইন্টারফেস বিল্ডারে আমার কাস্টম ক্লাসটি সেট করুন:

ইন্টারফেস নির্মাতা

এবং এখানে সুইফট ফাইল:

import UIKit

class TRAspectButton : UIButton {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.imageView?.contentMode = .ScaleAspectFit
    }
}

-1

আমার একই সমস্যা ছিল, তবে আমি এটি কাজ করতে পারিনি (সম্ভবত এটি এসডিকে দিয়ে একটি বাগ)।

অবশেষে, কর্মপরিকল্পনা হিসাবে, আমি UIImageViewআমার বোতামটির পিছনে একটি জায়গা রেখেছিলাম এবং আমার যে পছন্দগুলি পছন্দ হয়েছিল সেগুলি সেট করেছিলাম, তারপরে কেবল এর উপরে একটি ফাঁকা রেখেছি UIButton


7
এখানে একটি ইকো আছে কি? ;-)
ড্যান রে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.