AspectFit থেকে কোনও UIButton এ চিত্র স্কেল করবেন?


97

আমি কোনও ইউআইবুটনে একটি চিত্র যুক্ত করতে চাই এবং আমার চিত্রটি ইউআইবাটনটির সাথে মানিয়ে নিতে চাই (চিত্রটিকে আরও ছোট করুন)। কিভাবে এটি করতে দয়া করে আমাকে দেখান।

এটি আমি চেষ্টা করেছি, তবে এটি কার্যকর হয় না:

  • বোতামে চিত্র যুক্ত করা এবং ব্যবহার করা হচ্ছে setContentMode:
[self.itemImageButton setImage:stretchImage forState:UIControlStateNormal];
[self.itemImageButton setContentMode:UIViewContentModeScaleAspectFit];
  • একটি "প্রসারিত চিত্র" তৈরি করা:
UIImage *stretchImage = [updatedItem.thumbnail stretchableImageWithLeftCapWidth:0 topCapHeight:0];

আমি মনে করি এটি ফার্মওয়্যার 4.0.০ এবং তার উপরে ডিফল্ট আচরণ হিসাবে পরিবর্তিত হয়েছে।
শন বুধরাম

4
সমাধানের জন্য স্ট্যাকওভারফ্লো . com/a/28205566/481207 দেখুন ।
ম্যাট

উত্তর:


28

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

এই চিত্রটি আমি কোনও চিত্রকে স্কেল করতে ব্যবহার করছি:

ইউআইআইমেজ + অতিরিক্ত

@interface UIImage (Extras)
- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
@end;

ইউআইআইমেজ + এক্সট্রা.মি

@implementation UIImage (Extras)

- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize {

UIImage *sourceImage = self;
UIImage *newImage = nil;

CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;

CGFloat targetWidth = targetSize.width;
CGFloat targetHeight = targetSize.height;

CGFloat scaleFactor = 0.0;
CGFloat scaledWidth = targetWidth;
CGFloat scaledHeight = targetHeight;

CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

if (!CGSizeEqualToSize(imageSize, targetSize)) {

        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;

        if (widthFactor < heightFactor) 
                scaleFactor = widthFactor;
        else
                scaleFactor = heightFactor;

        scaledWidth  = width * scaleFactor;
        scaledHeight = height * scaleFactor;

        // center the image

        if (widthFactor < heightFactor) {
                thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
        } else if (widthFactor > heightFactor) {
                thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
        }
}


// this is actually the interesting part:

UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0);

CGRect thumbnailRect = CGRectZero;
thumbnailRect.origin = thumbnailPoint;
thumbnailRect.size.width  = scaledWidth;
thumbnailRect.size.height = scaledHeight;

[sourceImage drawInRect:thumbnailRect];

newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

if(newImage == nil) NSLog(@"could not scale image");


return newImage ;
}

@end

আপনি এটি আপনার পছন্দ মতো আকারে ব্যবহার করতে পারেন। পছন্দ:

[self.itemImageButton setImage:[stretchImage imageByScalingProportionallyToSize:CGSizeMake(20,20)]];

আপনার উত্তরের জন্য ধন্যবাদ, জ্যাক্যাম্প। আমার অনুপাত অনুসারে আকার দেওয়ার জন্য একটি পদ্ধতি ছিল। তবে আমি ইউআইবাটনকে আমার জন্য এটি করতে বলার উপায় খুঁজতে চেষ্টা করি। আমার চিত্রটি ইন্টারনেট থেকে লোড হয়েছে তাই সংকলনের সময় আমি এটির আকার পরিবর্তন করতে পারি না। বিটিডাব্লু, আপনার প্রতিক্রিয়াটির জন্য আপনাকে অনেক ধন্যবাদ
কং

4
যেহেতু চিত্রটি একটি ক্যালিয়ারে স্থাপন করা হয়েছে, রেন্ডার করা হয়েছে এবং কোয়ার্টজ ক্যাশে করেছেন, আপনি যদি এটি পুরো আকারে রাখেন তবে পারফরম্যান্স কোনও খারাপ হওয়া উচিত নয়। যে কোনও উপায়ে, আপনি ~ 1 বার আকার পরিবর্তন করছেন। আপনি যদি ক্রমাগত বোতামটি আকার পরিবর্তন করেন বা কোয়ার্টজকে চিত্রের স্তরটি পুনরায় আঁকতে উত্সাহিত করে এমন অন্য কিছু করে থাকেন তবে gcamp এর উত্তরটি আরও বেশি গুরুত্বপূর্ণ।
বেন গোটো

মনে হচ্ছে চিত্রের গুণমান হ্রাস পেয়েছে। আমি আইফোন 6 প্লাসে পরীক্ষা করছি। এটা সত্যি? আমারও 3x ইমেজ রয়েছে।
খান্ট থু লিন

হ্যাঁ এটি করবে, এই কোডটি বেশ পুরানো। এটি UIGraphicsBeginImageContextপরিবর্তে ছিল UIGraphicsBeginImageContextWithOptions। ঠিক ঠিক করে ফেলেছি।
gcamp

হ্যাঁ তবে বেশিরভাগ ক্ষেত্রে আপনি কয়েকটি চক্র আলগা করে তা বিবেচনা করে না, তাই মেষটি পূরণ করার কোনও অর্থ নেই
Radu Simionescu

204

আমারও একই সমস্যা ছিল। ইউআইবাটনের অভ্যন্তরে থাকা চিত্রভিউয়ের কন্টেন্টমোডটি কেবল সেট করুন।

[[self.itemImageButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[self.itemImageButton setImage:[UIImage imageNamed:stretchImage] forState:UIControlStateNormal];

আশাকরি এটা সাহায্য করবে.


14
আপনি ইমেজভিউ সেট করছেন তা নিশ্চিত করুন । আমি কিছুটা হলেও খেয়াল করতে ব্যর্থ হয়েছি যে আমি এখনও ব্যাকগ্রাউন্ড ইমেজভিউটি ব্যবহার করছি এবং এটি তার জন্য কাজ করছে না।
আলেকজান্দ্রে গোমেস

4
বোতামের অবস্থাটি 'হাইলাইট' করা হলে এই পদ্ধতিতে কিছু সমস্যা রয়েছে বলে মনে হয়। চিত্রটি ফিল মোডে ফিরে আসবে। কোন ধারণা?
ইউয়ানফেই ঝু

এটা আমার কাজ করছে না। যাইহোক, আমি এটি ব্যবহার করে এটি তৈরি করেছি [সেল্ফি.ইটিএমআইমেজবটন সেটব্যাকগ্রাউন্ড ইমেজ: [ইউআই ইমেজ ইমেজ নাম: স্ট্রেচ আইমেজ] ফর স্টেট: ইউআইসিএন্ট্রোলস্টেট নরমাল];
মিকি

4
এটি আমার পক্ষে কাজ করেছে। আমি উপরের মতো সামগ্রী মোড সেট করেছি set তবে চিত্রটি "ফিল মোডে" ফিরে যেতে এড়াতে আপনাকে হাইলাইটেড স্টেটের একই চিত্রটি সেট করতে হবে। উদাহরণস্বরূপ, [ইমেজবটন সেট ইমেজ: ইমেজ ফর স্টেট: ইউআইসিএন্ট্রোলস্টেট হাইটলাইটেড];
ক্রিস্টোফার

4
আপনি ইন্টারফেস বিল্ডারে কী পথ imageView.contentMode, প্রকার Numberএবং মান সহ এটি করতে পারেন1
bendytree

108

এখানে উত্তরগুলির মধ্যে সত্যই আমার পক্ষে কাজ করেনি, আমি নিম্নলিখিত কোড দিয়ে সমস্যার সমাধান করেছি:

button.contentMode = UIViewContentModeScaleToFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

আপনি ইন্টারফেস বিল্ডারে এটিও করতে পারেন।

এখানে চিত্র বর্ণনা লিখুন


4
এটি আপনাকে ওপি কর্তৃক অনুরোধ অনুসারে মানানসই আচরণ দেয় না ।
অর্টউইন জেন্টজ

4
@ অর্টউইনজেন্টজ আপনি মোডটি নির্বাচন করতে পারেন এবং তার Aspect fitপরিবর্তে সেট করতে পারেন scale to fill
ড্যানিয়েল

55

প্রোগ্রাম ফিমেটিক্যালি ফিট মোডে একটি ইউআইবাটন ইমেজভিউ সেট করার সহজতম উপায় :

সুইফট

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit

উদ্দেশ্য গ

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

দ্রষ্টব্য: আপনি একটি দৃষ্টিভঙ্গি পূরণের মোড সেট করতে .scaleAspectFit (ইউআইভিউসকন্টেন্টমোডস্কেলএস্পেক্টফিট) থেকে।


20

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

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

16

এটি এখন আইবির ইউআইবাটন বৈশিষ্ট্যগুলির মাধ্যমে করা যেতে পারে। কীটি হ'ল আপনার চিত্রটিকে ব্যাকগ্রাউন্ড হিসাবে সেট করুন, অন্যথায় এটি কাজ করবে না।

এখানে চিত্র বর্ণনা লিখুন


14

ডেভের উত্তরটি প্রসারিত করে আপনি রানটাইম বৈশিষ্ট্য ব্যবহার করে কোনও কোড ছাড়াই আইবিতে সমস্ত contentModeবোতামটি সেট করতে পারেন imageView:

এখানে চিত্র বর্ণনা লিখুন

  • 1মানে UIViewContentModeScaleAspectFit,
  • 2মানে হবে UIViewContentModeScaleAspectFill

8

আপনি যদি কেবল নিজের বোতামের চিত্রটি হ্রাস করতে চান:

yourButton.contentMode = UIViewContentModeScaleAspectFit;
yourButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);

এটি আপনার বাটন.আইমেজভিউ.কন্টেন্টমোড = ইউআইভিউউকন্টেন্টমোডস্কেলএস্পেক্টফিট হওয়া উচিত;
sdsykes

.আইমেজভিউ দিয়ে চেষ্টা করেন নি। এটি বেশ ভাল ছাড়া কাজ করছে।
Tulleb

6

1 - সাফ বাটন ডিফল্ট পাঠ্য (গুরুত্বপূর্ণ)

2 - চিত্রের মতো প্রান্তিককরণ সেট করুন

3 - চিত্রের মতো সামগ্রী মোড সেট করুন

এখানে চিত্র বর্ণনা লিখুন


ভাল উত্তর ভাই .. আমাকে অনেক সাহায্য করেছেন। ধন্যবাদ!
ভরথরাও

5

আমার কাছে এমন একটি পদ্ধতি রয়েছে যা আমার পক্ষে তা করে। পদ্ধতিটি গ্রহণ করে UIButtonএবং চিত্রের দিকটি ফিট করে।

-(void)makeImageAspectFitForButton:(UIButton*)button{
    button.imageView.contentMode=UIViewContentModeScaleAspectFit;
    button.contentHorizontalAlignment=UIControlContentHorizontalAlignmentFill;
    button.contentVerticalAlignment=UIControlContentVerticalAlignmentFill;
}

4

সবচেয়ে পরিষ্কার সমাধানটি হ'ল অটো লেআউট ব্যবহার করা । আমি আমার সামগ্রীর সংক্ষেপণ প্রতিরোধের অগ্রাধিকারটিকে হ্রাস করেছি UIButtonএবং ইন্টারফেস বিল্ডারের মাধ্যমে চিত্রটি ( ব্যাকগ্রাউন্ড চিত্র নয় ) সেট করেছি । এর পরে আমি কয়েকটি বাধা যুক্ত করেছি যা আমার বোতামের আকার নির্ধারণ করে (আমার ক্ষেত্রে বেশ জটিল) এবং এটি কবজির মতো কাজ করে।


এটি আমার পক্ষে কাজ করেছে - তবে কেবলমাত্র যদি আমি "ব্যাকগ্রাউন্ড চিত্র" ব্যবহার করতে পছন্দ করি তবে আসল চিত্রটি নয়। যাই হোক না কেন কাজ করে! এটি আমাকে চালাচ্ছিল
অ্যান্ডি

এক্সকোড .2.২ এর আওতায় এটি আমার পক্ষে কাজ করেছে তবে @ অ্যান্ড্রুহেইনলাইন যেমন বলেছিলেন, ব্যবহৃত হয়েছিলBackground Image
RoLYroLLs

3

নিশ্চিত হয়ে নিন যে আপনি চিত্রটি চিত্রের বৈশিষ্ট্যে সেট করেছেন তবে ব্যাকগ্রাউন্ডে নয়


2

ব্যাকগ্রাউন্ড চিত্রটি খুব সহজেই স্কেল এপেক্ট ফিল পূরণে সেট করা যায়। ইউআইবাটনের একটি সাবক্লাসে এই জাতীয় কিছু করা দরকার:

- (CGRect)backgroundRectForBounds:(CGRect)bounds
{
    // you'll need the original size of the image, you 
    // can save it from setBackgroundImage:forControlState
    return CGRectFitToFillRect(__original_image_frame_size__, bounds);
}

// Utility function, can be saved elsewhere
CGRect CGRectFitToFillRect( CGRect inRect, CGRect maxRect )
{
    CGFloat origRes = inRect.size.width / inRect.size.height;
    CGFloat newRes = maxRect.size.width / maxRect.size.height;

    CGRect retRect = maxRect;

    if (newRes < origRes)
    {
        retRect.size.width = inRect.size.width * maxRect.size.height / inRect.size.height;
        retRect.origin.x = roundf((maxRect.size.width - retRect.size.width) / 2);
    }
    else
    {
        retRect.size.height = inRect.size.height * maxRect.size.width / inRect.size.width;
        retRect.origin.y = roundf((maxRect.size.height - retRect.size.height) / 2);
    }

    return retRect;
}

সাবক্লাস ছাড়া এটি কি সম্ভব নয়?
Iulian Onofrei

এই উত্তরটি ব্যাকগ্রাউন্ড ইমেজের জন্য ছিল। মূল চিত্রের জন্য আপনি চিত্রটি অ্যাডজিনসেটস সহ বানর করতে পারেন।
অ্যান্ডি পোস 18

আমি জানি, এবং আমি চেয়েছিলাম সাবক্লাস ছাড়াই এটি অর্জন করা সম্ভব কিনা।
Iulian Onofrei

আমি যতদূর জানি, আপনি সাবক্লাসিং ব্যাকগ্রাউন্ড ইমেজ সামঞ্জস্য করতে পারবেন না।
অ্যান্ডি পোজ


0

Xamarin.iOS (সি #) এর জন্য:

    myButton.VerticalAlignment = UIControlContentVerticalAlignment.Fill;
    myButton.HorizontalAlignment = UIControlContentHorizontalAlignment.Fill;
    myButton.ImageView.ContentMode = UIViewContentMode.ScaleAspectFit;

-1

আপনাকে কেবল তিনটি ইভেন্টের জন্য ইউআইবাটন ইমেজভিউয়ের সামগ্রী মোড সেট করতে হবে। -

[cell.button setImage:[UIImage imageWithData:data] forState:UIControlStateNormal];

[cell.button setImage:[UIImage imageWithData:data] forState:UIControlStateHighlighted];

[cell.imgIcon setImage:[UIImage imageWithData:data] forState:UIControlStateSelected];

হাইলাইট করার সময় বা বোতামের আকারটি স্কোয়াআর হয় এবং চিত্রের আকারটি আয়তক্ষেত্রাকার হয় তা নির্বাচন করার সময় আমাদের কাছে তিনটি ইভেন্ট বেকোজের কোড রয়েছে তবে তা হাইলাইট করার সময় বা নির্বাচনের সময় এটি স্কোয়ার চিত্রটি প্রদর্শন করবে।

আমি নিশ্চিত এটি আপনার পক্ষে কাজ করবে।


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