আনুপাতিকভাবে কীভাবে একটি ইউআইআইমেজভিউ স্কেল করবেন?


341

আমার একটি ইউআইআইমেজভিউ রয়েছে এবং এটির উচ্চতা বা প্রস্থকে দিয়ে আনুপাতিকভাবে এটি কমিয়ে আনার উদ্দেশ্য।

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 

//Add image view
[self.view addSubview:imageView];   

//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;

//change width of frame
CGRect frame = imageView.frame;
frame.size.width = 100;
imageView.frame = frame;

চিত্রটি পুনরায় আকার দিয়েছে তবে অবস্থানটি শীর্ষে বামে নেই। স্কেলিং ইমেজ / ইমেজভিউয়ের সেরা পদ্ধতির কী এবং আমি কীভাবে অবস্থানটি সংশোধন করব?


আপনার কোডের সাথে আমার মতো কিছু রয়েছে যা আমার জন্য কাজ করে না "UII छवि * চিত্র = [UII छवि চিত্রনামযুক্ত: চিত্রস্ট্রিং]; UIImageView * চিত্রভিউ = [[UII छवि বরাদ্দ] initWithI छवि: চিত্র]"; একটি অভিযান চালিয়েছে যা আমার অ্যাপ্লিকেশনটিকে মেরে ফেলেছে "" অপ্রয়োজনীয় ব্যতিক্রমের কারণে 'এনএসআইএনওডিয়ালিটিজমেন্ট এক্সেক্সেশন' এর সমাপ্তি অ্যাপ্লিকেশন ', কারণ:' - [ইউআইআইবিজেশন ইভিউইমিজেশন:]: অজানা নির্বাচক নির্বাচিত উদাহরণ 0xd815930 'তে প্রেরণ করা হয়েছে "
স্পায়ার

3
@ স্পায়ার এটি ইউআইআইমেজ দেখুনউইআইআইজেজ নয় ^^
টমাস ডেকাক্স

2
এটি আমার পক্ষে কাজ করে। আপনার ইউআইআইমেজভিউতে - কনটেন্টমডটি সেট করতে মনে রাখবেন - আপনার ইউআইআইমেজ নয়। - এখানে আমার: ইউআইআইমেজভিউ * ছবিউইউ = [[ইউআইজিমেজভিউ বরাদ্দ] ইনিউথফ্রেম: সিজিআরেক্টমেক (0,0,30,30)]
জারেট বার্নেট

উত্তর:


541

খুব সহজেই ঠিক করা হয়েছে, একবার আমি ডকুমেন্টেশন পেয়েছি!

 imageView.contentMode = UIViewContentModeScaleAspectFit;

19
আপনি আসলে কি উত্তর দিয়েছিলেন? রনির প্রশ্নে তিনি উল্লেখ করেছেন যে তিনি এটি ব্যবহার করেছেন
ডিজেল

3
আপনার ইমেজভিউ ক্লিপিং নাও হতে পারে। ইমেজভিউ.লেয়ার.মাস্কটোবাউন্ডস = হ্যাঁ;
ম্যাকওয়ার্থ

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

1
সুইফটে একই সমস্যার কারও জন্য: ScaleAspectFitএখন এটি একটি enum UIViewContentMode, তাই আপনি সেট করবেন imageView.contentMode = UIViewContentMode.ScaleAspectFit। পিরিয়ড নোট করুন।
sudo

1
translatesAutoresizingMaskIntoConstraintsসেট করা উচিত নয় false। এই সম্পত্তিটি পুনরায় আকার
জেরাল্ড

401

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

সম্পর্কিত চিত্রটি এখানে:

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


AspectFit সেট হয়ে গেলে আপনি উল্লম্বভাবে কীভাবে সারিবদ্ধ হন?
এসবেনার

@ ইএসবেনার এটি স্বয়ংক্রিয়ভাবে ঘটবে। আপনি প্রয়োজন হিসাবে একটি ওভাররাইড সন্ধান করতে সক্ষম হতে পারেন তবে আমি বর্তমানে এটির একটি সম্পর্কে জানি না: |
জ্যাকসনকর

আমি Aspect Fill ব্যবহার করতে চাই তবে আমি সম্পূর্ণ চিত্রটি প্রদর্শন করতে চাই। তারপরে আমার 'ক্ষেত্রের সাথে ফিট করার' আকারটি পরিবর্তন করা দরকার। আমি কীভাবে অটো-লেআউট দিয়ে এটি করতে পারি?
লি

@lee অনেকগুলি বিকল্প রয়েছে তবে এটি সত্যই আপনার পরিস্থিতির উপর নির্ভরশীল। আমি একটি এসওএফ চ্যাট তৈরি করেছি যাতে আমরা আপনার বিষয় নিয়ে আলোচনা করতে পারি এবং আমি আপনার কাছে আমার কাছে তথ্য চাইব, যদি আপনি এত ঝোঁক হন তবে এগিয়ে যাবেন
জ্যাকসনকর

@ জ্যাকসন এটি স্বয়ংক্রিয়ভাবে ঘটে না। এটি ইউআইআইমেজভিউ স্কেল করার আগে মূল চিত্রটির উচ্চতা চয়ন করে, তাই উচ্চতাটি নতুন দিকের ফিটযুক্ত উচ্চতার সাথে মেলে না। যদি কেউ এটি করার জন্য কোনও দুর্দান্ত উপায় বের করে থাকে তবে দয়া করে আমাকে জানান।
datWooWoo

78

আমি কেবল এটি চেষ্টা করেছি এবং ইউআইআইমেজ _ আইমেজস্কেল্টটোসাইজ সমর্থন করে না।

আমি একটি বিভাগ ব্যবহার করে ইউআইআইমেজে একটি পদ্ধতি যুক্ত করে শেষ করেছি - একটি পরামর্শ আমি অ্যাপল দেব ফোরামে পেয়েছি।

প্রজেক্টে ব্যাপী .h -

@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) == NO) {

        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:

    UIGraphicsBeginImageContext(targetSize);

    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;

1
পরিবর্তে UIGraphicsBeginImageContext(targetSize);করেন তাহলে ([UIScreen instancesRespondToSelector:@selector(scale)]) { UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0f); } else { UIGraphicsBeginImageContext(targetSize); }এটা না করে সমর্থন অক্ষিপট প্রদর্শন ঝাপসা
সাইকেল


30

আপনি imageViewআকারটি মেলাতে চেষ্টা করতে পারেন image। নিম্নলিখিত কোড পরীক্ষা করা হয় না।

CGSize kMaxImageViewSize = {.width = 100, .height = 100};
CGSize imageSize = image.size;
CGFloat aspectRatio = imageSize.width / imageSize.height;
CGRect frame = imageView.frame;
if (kMaxImageViewSize.width / aspectRatio <= kMaxImageViewSize.height) 
{
    frame.size.width = kMaxImageViewSize.width;
    frame.size.height = frame.size.width / aspectRatio;
} 
else 
{
    frame.size.height = kMaxImageViewSize.height;
    frame.size.width = frame.size.height * aspectRatio;
}
imageView.frame = frame;

1
ইমেজভিউ.ফ্রেমে = XXXX (কিছু) সেট করা আউটপুটটিতে কোনও আলাদা করে না। কোন ধারণা কেন?
শ্রিজিজ

1
@ শ্রিমিজ আপনি যদি অটোলেআউট ব্যবহার করছেন তবে ইউআইভিউতে [সেট ট্রান্সলেটস অটোআরাইজাইজ ...] এর সাথে গণ্ডগোলের বিষয়টি নিশ্চিত করুন। আপনি যদি না জানেন তবে এটি কী ডকুমেন্টেশন চেক করে! :)
datWooWoo

13

যে কোনও একটি এইভাবে একটি ইউআইআইমেজকে আকার দিতে পারে can

image = [UIImage imageWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp];

13
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 


//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;

//change width of frame
//CGRect frame = imageView.frame;
//frame.size.width = 100;
//imageView.frame = frame;

//original lines that deal with frame commented out, yo.
imageView.frame = CGRectMake(10, 20, 60, 60);

...

//Add image view
[myView addSubview:imageView]; 

শীর্ষে পোস্ট করা মূল কোডটি আইওএস ৪.২ এ আমার জন্য ভাল কাজ করেছে।

আমি দেখতে পেলাম যে একটি সিজিআরেক্ট তৈরি করা এবং সমস্ত শীর্ষ, বাম, প্রস্থ এবং উচ্চতার মান উল্লেখ করা আমার ক্ষেত্রে অবস্থানটি সামঞ্জস্য করার সবচেয়ে সহজতম উপায় ছিল যা কোনও টেবিলের ঘরের ভিতরে একটি ইউআইআইমেজভিউ ব্যবহার করছিল। (অবজেক্টগুলি প্রকাশের জন্য এখনও কোড যুক্ত করা দরকার)


13

মোড নির্বাচন Aspect Fillকরে Clip Subviewsবাক্সটি চেক করে আপনার ইমেজভিউ সেট করুন ।

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


10

এটি আমার পক্ষে সুইফট ২.x এর জন্য কাজ করে:

imageView.contentMode = .ScaleAspectFill
imageView.clipsToBounds = true;



5

UIImageView + + Scale.h:

#import <Foundation/Foundation.h>

@interface UIImageView (Scale)

-(void) scaleAspectFit:(CGFloat) scaleFactor;

@end

UIImageView + + Scale.m:

#import "UIImageView+Scale.h"

@implementation UIImageView (Scale)


-(void) scaleAspectFit:(CGFloat) scaleFactor{

    self.contentScaleFactor = scaleFactor;
    self.transform = CGAffineTransformMakeScale(scaleFactor, scaleFactor);

    CGRect newRect = self.frame;
    newRect.origin.x = 0;
    newRect.origin.y = 0;
    self.frame = newRect;
}

@end

2

আমি নিম্নলিখিত কোডগুলি ব্যবহার করেছি where

if (image.size.height<self.imageCoverView.bounds.size.height && image.size.width<self.imageCoverView.bounds.size.width)
{
    [self.profileImageView sizeToFit];
    self.profileImageView.contentMode =UIViewContentModeCenter
}
else
{
    self.profileImageView.contentMode =UIViewContentModeScaleAspectFit;
}

2

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


1

সাধারণত আমি আমার অ্যাপ্লিকেশনগুলির জন্য এই পদ্ধতিটি ব্যবহার করি ( সুইফট ২.x সামঞ্জস্যপূর্ণ):

// Resize UIImage
func resizeImage(image:UIImage, scaleX:CGFloat,scaleY:CGFloat) ->UIImage {
    let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(scaleX, scaleY))
    let hasAlpha = true
    let scale: CGFloat = 0.0 // Automatically use scale factor of main screen

    UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
    image.drawInRect(CGRect(origin: CGPointZero, size: size))

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return scaledImage
}

0

আমি মনে করি আপনি যেমন কিছু করতে পারেন

image.center = [[imageView window] center];

3
এটি চিত্রটিকে স্কেল করবে না তবে কেবল এটি কেন্দ্র করবে।
ডেভিড সালজার

-3

আপনি সহজেই এটি স্কেল করতে পারেন তা এখানে।

এটি সিমুলেটার এবং আইফোনের সাথে 2.x এ কাজ করে।

UIImage *thumbnail = [originalImage _imageScaledToSize:CGSizeMake(40.0, 40.0) interpolationQuality:1];

হাই, আপনি কি জানেন যে আন্তঃবিভাজনীয়তা: প্যারামিটারটি কী করে? ধন্যবাদ
ব্যবহারকারী 102008

27
এটি একটি অনিবন্ধিত পদ্ধতি (আন্ডারস্কোরটি একটি মৃত শর্ত) যার ফলে অ্যাপ্লিকেশন প্রত্যাখ্যান হতে পারে।
শেগি ব্যাঙ

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