চিত্রটি ছোট হওয়া সত্ত্বেও আমি কীভাবে ইউআইটিএবলভিউসেল এর চিত্রকল্পকে একটি নির্দিষ্ট আকার তৈরি করব


104

আমার কাছে গুচ্ছ ইমেজের ভিউগুলি ব্যবহার করার জন্য একগুচ্ছ চিত্র রয়েছে, সেগুলি 50x50 এর চেয়ে বড় নয়। যেমন 40x50, 50x32, 20x37 .....

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

আমার 'সেলফোর্ডরোআউটআইডেক্সপথ' পদ্ধতির অভ্যন্তরে কোডটি চেষ্টা করছি

cell.imageView.autoresizingMask = ( UIViewAutoresizingNone );
cell.imageView.autoresizesSubviews = NO;
cell.imageView.contentMode = UIViewContentModeCenter;
cell.imageView.bounds = CGRectMake(0, 0, 50, 50);
cell.imageView.frame = CGRectMake(0, 0, 50, 50);
cell.imageView.image = [UIImage imageWithData: imageData];

আপনি দেখতে পাচ্ছেন যে আমি কয়েকটি জিনিস চেষ্টা করেছি, কিন্তু তাদের কোনওটিই কাজ করে না।

উত্তর:


152

সবকিছু পুনরায় লেখার প্রয়োজন নেই। পরিবর্তে আমি এটি করার পরামর্শ দিচ্ছি:

এটি আপনার কাস্টম ঘরে থাকা .m ফাইলের মধ্যে পোস্ট করুন।

- (void)layoutSubviews {
    [super layoutSubviews];
    self.imageView.frame = CGRectMake(0,0,32,32);
}

এটি কৌশলটি সুন্দরভাবে করা উচিত। :]


28
আপনি যদি সেট করেন self.imageView.boundsতবে চিত্রটি কেন্দ্রিক হবে।
বিএলইবি

45
আমরা যদি একটি সাবক্লাস যোগ না করি UITableViewCell?
অবিচ্ছিন্নতা

3
@ 動靜 能量: ইউআইটিএবল ভিউসেলকে উপশম তৈরি করা এটির কাজ করার জন্য এটি প্রধান কৌশল।
auco

5
এটি আমার পক্ষে কাজ করে না। চিত্রটি এখনও পুরো চিত্র ভিউতে আবদ্ধ।
joslinm

14
লেবেলগুলি ভুলভাবে বিভক্ত হওয়ায় এটি আমার পক্ষে কার্যকর হয় না।
nverinaud

139

আপনার যাদের জন্য একটি সাবক্লাস নেই UITableViewCell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 [...]

      CGSize itemSize = CGSizeMake(40, 40);
      UIGraphicsBeginImageContextWithOptions(itemSize, NO, UIScreen.mainScreen.scale);
      CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
      [cell.imageView.image drawInRect:imageRect];
      cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
      UIGraphicsEndImageContext();

 [...]
     return cell;
}

উপরের কোডটি 40x40 হতে আকার নির্ধারণ করে।

সুইফট 2

    let itemSize = CGSizeMake(25, 25);
    UIGraphicsBeginImageContextWithOptions(itemSize, false, UIScreen.mainScreen().scale);
    let imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
    cell.imageView?.image!.drawInRect(imageRect)
    cell.imageView?.image! = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

অথবা আপনি @ টমির প্রস্তাবিত অন্য একটি (পরীক্ষিত নয়) পদ্ধতির ব্যবহার করতে পারেন:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 [...]

      CGSize itemSize = CGSizeMake(40, 40);
      UIGraphicsBeginImageContextWithOptions(itemSize, NO, 0.0)          
 [...]
     return cell;
}

সুইফ্ট 3+

let itemSize = CGSize.init(width: 25, height: 25)
UIGraphicsBeginImageContextWithOptions(itemSize, false, UIScreen.main.scale);
let imageRect = CGRect.init(origin: CGPoint.zero, size: itemSize)
cell?.imageView?.image!.draw(in: imageRect)
cell?.imageView?.image! = UIGraphicsGetImageFromCurrentImageContext()!;
UIGraphicsEndImageContext();

উপরের কোডটি উপরের স্যুইফ্ট 3+ সংস্করণ।


3
চিত্রের বিকৃতিটি ইউআইজিগ্রাফিক্সবেগিনআইমেজকন্টেক্সট উইথঅ্যাপশনগুলি (আইটেম সাইজ, NO, UIScreen.mainScreen.scale) দ্বারা স্থির করা যেতে পারে; UIGraphicsBeginImageContext (আইটেম সাইজ) এর পরিবর্তে;
কিরণ রুথ আর

1
ভাল উত্তর. বিটিডাব্লু, আমি বিকল্পটি পেলাম না UIScreen.mainScreen.scaleতাই আমি কেবল সাথে গিয়েছিলাম UIGraphicsBeginImageContext। বেসিক কক্ষে চিত্রের ভিউটিকেও পুনরায় আকার দিন।
denikov

3
@ জার্মানআত্তানাসিওরুইজ নির্বাচন করে সেলটি আবার আসলটির সাথে আকার দেয়, এটি কীভাবে সমাধান করা যায় তা কি সেভাবেই অনুমান করা যায়?
বনি

6
আমার মতো যারা বিভ্রান্ত হয়েছেন তাদের সবার জন্য আপনার প্রসঙ্গটি শুরু করার আগে চিত্রটি সেট করা দরকার। ie cell.imageView.image = [UII छवि চিত্রনামযুক্ত: @ "my_image.png"];
গাই লো 2

5
এ জাতীয় ব্যয়বহুল ক্রিয়াকলাপগুলি সেলফোরআরএটিআইডেক্সপথের অংশ হওয়া উচিত নয়
ক্রিজাই

33

আমি এটি কীভাবে করেছি তা এখানে। এই কৌশলটি পাঠ্য এবং বিশদ পাঠ্য লেবেলগুলি যথাযথভাবে বাম দিকে সরানোর যত্ন নেয়:

@interface SizableImageCell : UITableViewCell {}
@end
@implementation SizableImageCell
- (void)layoutSubviews {
    [super layoutSubviews];

    float desiredWidth = 80;
    float w=self.imageView.frame.size.width;
    if (w>desiredWidth) {
        float widthSub = w - desiredWidth;
        self.imageView.frame = CGRectMake(self.imageView.frame.origin.x,self.imageView.frame.origin.y,desiredWidth,self.imageView.frame.size.height);
        self.textLabel.frame = CGRectMake(self.textLabel.frame.origin.x-widthSub,self.textLabel.frame.origin.y,self.textLabel.frame.size.width+widthSub,self.textLabel.frame.size.height);
        self.detailTextLabel.frame = CGRectMake(self.detailTextLabel.frame.origin.x-widthSub,self.detailTextLabel.frame.origin.y,self.detailTextLabel.frame.size.width+widthSub,self.detailTextLabel.frame.size.height);
        self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    }
}
@end

...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[SizableImageCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    cell.textLabel.text = ...
    cell.detailTextLabel.text = ...
    cell.imageView.image = ...
    return cell;
}

ধন্যবাদ, ক্রিস। এটি পুরোপুরি কাজ করে। আপনি অটোরিলেজ সরিয়ে এটি আপডেট করতে চান কারণ এআরসি এটি এখন নিষিদ্ধ করে। দুর্দান্ত উত্তর যদিও!
CSawy

1
এটি আজও সেরা সমাধান। ধন্যবাদ.
রামী বেলজান্তি

এই দিনগুলিতে আমি সম্ভবত কোনও স্টিবোর্ডে একটি এক্সিব বা প্রোটোটাইপ সেল দিয়ে একটি কাস্টম সেল তৈরি করার এবং একটি পুরো সেল চিত্র দেখানোর জন্য কোনও মানক কক্ষের চিত্রদর্শনের সাথে সম্পর্কিত নয় recommend তবে এটি এখনও যথেষ্ট সহজ, আমার ধারণা!
ক্রিস

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

ডাব্লু <কাঙ্ক্ষিত সাথে, যা আমার কাছে মনে হয় এটি আগ্রহের ব্যবহার (কমপক্ষে, প্রশ্নে) থাকলে এই উত্তরটি কিছুই করে না।
নট

21

ইমেজ ভিউ টেবিলভিউ ঘরে একটি উপদর্শন হিসাবে যুক্ত করুন

UIImageView *imgView=[[UIImageView alloc] initWithFrame:CGRectMake(20, 5, 90, 70)];
imgView.backgroundColor=[UIColor clearColor];
[imgView.layer setCornerRadius:8.0f];
[imgView.layer setMasksToBounds:YES];
[imgView setImage:[UIImage imageWithData: imageData]];
[cell.contentView addSubview:imgView];

1
আপনি যদি আরসি ব্যবহার না করেন তবে ইমগভিউ প্রকাশ করতে ভুলবেন না।
চার্লি মনরো

14

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


6

আরও ভাল একটি চিত্রের ভিউ তৈরি করুন এবং এটিকে ঘরে একটি উপ-দৃশ্য হিসাবে যুক্ত করুন hen তারপরে আপনি পছন্দসই ফ্রেমের আকার পেতে পারেন।


এটি চেষ্টা করে দেখতে খুব ভাল লাগছে তবে কোষগুলিতে থাকা পাঠ্যগুলি এখন চিত্রগুলিকে ওভারল্যাপ করে, আমি কীভাবে সামগ্রীর ভিউ 50 ডিক্সে পিক্সেলটি স্থানান্তর করব? সেল.কন্টেন্টভিউ.বাউন্ডস = সিজিআরেক্টমেক (50, 0, 270, 50); কোন প্রভাব নেই
রবার্ট

1
সেল ডিফল্ট ভিউটি ব্যবহার না করে, লেবেল তৈরি করুন এবং এটিকে ঘরে একটি উপদর্শন হিসাবে যুক্ত করুন, তারপরে লেবেল পাঠ্যের বৈশিষ্ট্যে পাঠ্যটি বরাদ্দ করুন। এটির মাধ্যমে আপনি নিজের প্রয়োজন অনুযায়ী ঘরটি ডিজাইন করতে পারেন।
যোদ্ধা

আপনি যদি কোনও ঘরে শিরোনাম, তারিখ, বিবরণ ইত্যাদি, আরও মান প্রদর্শন করতে চান তবে এটি আরও সহায়ক হবে।
যোদ্ধা

ঠিক আছে, তাই মূলত অসুস্থদের প্রোগ্রামটিমেটিকভাবে সেলটির রিমেক করতে হয়। খুব শক্ত হওয়া উচিত নয়। সাহায্যের জন্য ধন্যবাদ.
রবার্ট

6

সিম্পল সুইফট ,

পদক্ষেপ 1: দ্বিতীয় UITableViewCell
ধাপের একটি সাবক্লাস তৈরি করুন : এই পদ্ধতিটি ইউআইটিএবলভিউসিলের সাবক্লাসে যুক্ত করুন

override func layoutSubviews() {
    super.layoutSubviews()
    self.imageView?.frame = CGRectMake(0, 0, 10, 10)
}

পদক্ষেপ 3: সেই সাবক্লাস ব্যবহার করে সেল অবজেক্ট তৈরি করুন cellForRowAtIndexPath,

Ex: let customCell:CustomCell = CustomCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")

পদক্ষেপ 4: উপভোগ করুন


2
UIImage *image = cell.imageView.image;

UIGraphicsBeginImageContext(CGSizeMake(35,35));
// draw scaled image into thumbnail context

[image drawInRect:CGRectMake(5, 5, 35, 35)]; //
UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext();
// pop the context
UIGraphicsEndImageContext();
if(newThumbnail == nil)
{
    NSLog(@"could not scale image");
    cell.imageView.image = image;
}
else
{
    cell.imageView.image = newThumbnail;
}

2

এটি দ্রুতগতির জন্য আমার জন্য কাজ করেছে:

ইউআইটিএবলভিউসিলের একটি সাবক্লাস তৈরি করুন (নিশ্চিত করুন যে আপনি স্টোরবোর্ডে আপনার সেলটি লিঙ্ক করেছেন)

class MyTableCell:UITableViewCell{
    override func layoutSubviews() {
        super.layoutSubviews()

        if(self.imageView?.image != nil){

            let cellFrame = self.frame
            let textLabelFrame = self.textLabel?.frame
            let detailTextLabelFrame = self.detailTextLabel?.frame
            let imageViewFrame = self.imageView?.frame

            self.imageView?.contentMode = .ScaleAspectFill
            self.imageView?.clipsToBounds = true
            self.imageView?.frame = CGRectMake((imageViewFrame?.origin.x)!,(imageViewFrame?.origin.y)! + 1,40,40)
            self.textLabel!.frame = CGRectMake(50 + (imageViewFrame?.origin.x)! , (textLabelFrame?.origin.y)!, cellFrame.width-(70 + (imageViewFrame?.origin.x)!), textLabelFrame!.height)
            self.detailTextLabel!.frame = CGRectMake(50 + (imageViewFrame?.origin.x)!, (detailTextLabelFrame?.origin.y)!, cellFrame.width-(70 + (imageViewFrame?.origin.x)!), detailTextLabelFrame!.height)
        }
    }
}

সেলফোর্ডআউট ইন্ডেক্সপথ-এ, সেলটি আপনার নতুন ঘর প্রকার হিসাবে চিহ্নিত করুন:

    let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! MyTableCell

আপনার লেআউটের সাথে মানানসই সংখ্যা মান অবশ্যই পরিবর্তন করুন


1

আমি @ জেরমানআটানাসিওর উত্তর ব্যবহার করে একটি এক্সটেনশন তৈরি করেছি। এটি একটি পছন্দসই আকারে একটি চিত্র পুনরায় আকার দেওয়ার একটি পদ্ধতি এবং চিত্রটিতে স্বচ্ছ মার্জিন যুক্ত করার সময় একই পদ্ধতি করার জন্য একটি পদ্ধতি সরবরাহ করে (এটি আপনি টেবিলের দর্শনগুলির ক্ষেত্রেও কার্যকর হতে পারেন যেখানে আপনি চিত্রটিও মার্জিন রাখতে চান)।

import UIKit

extension UIImage {

    /// Resizes an image to the specified size.
    ///
    /// - Parameters:
    ///     - size: the size we desire to resize the image to.
    ///
    /// - Returns: the resized image.
    ///
    func imageWithSize(size: CGSize) -> UIImage {

        UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.mainScreen().scale);
        let rect = CGRectMake(0.0, 0.0, size.width, size.height);
        drawInRect(rect)

        let resultingImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        return resultingImage
    }

    /// Resizes an image to the specified size and adds an extra transparent margin at all sides of
    /// the image.
    ///
    /// - Parameters:
    ///     - size: the size we desire to resize the image to.
    ///     - extraMargin: the extra transparent margin to add to all sides of the image.
    ///
    /// - Returns: the resized image.  The extra margin is added to the input image size.  So that
    ///         the final image's size will be equal to:
    ///         `CGSize(width: size.width + extraMargin * 2, height: size.height + extraMargin * 2)`
    ///
    func imageWithSize(size: CGSize, extraMargin: CGFloat) -> UIImage {

        let imageSize = CGSize(width: size.width + extraMargin * 2, height: size.height + extraMargin * 2)

        UIGraphicsBeginImageContextWithOptions(imageSize, false, UIScreen.mainScreen().scale);
        let drawingRect = CGRect(x: extraMargin, y: extraMargin, width: size.width, height: size.height)
        drawInRect(drawingRect)

        let resultingImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        return resultingImage
    }
}

1

এখানে সুইজার্ট 3-এর জন্য লিখিত @germanattanasio এর কার্য পদ্ধতি

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
    cell.imageView?.image = myImage
    let itemSize = CGSize(width:42.0, height:42.0)
    UIGraphicsBeginImageContextWithOptions(itemSize, false, 0.0)
    let imageRect = CGRect(x:0.0, y:0.0, width:itemSize.width, height:itemSize.height)
    cell.imageView?.image!.draw(in:imageRect)
    cell.imageView?.image! = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
}

1

আপনি যদি ব্যবহার করেন তবে cell.imageView?.translatesAutoresizingMaskIntoConstraints = falseআপনি চিত্রভিউতে সীমাবদ্ধতা সেট করতে পারেন। আমি একটি প্রকল্পে ব্যবহৃত একটি কাজের উদাহরণ এখানে। আমি সাবক্লাসিং এড়ানো এবং প্রোটোটাইপ কোষগুলির সাথে স্টোরিবোর্ড তৈরি করার দরকার পড়েনি তবে দৌড়াতে আমাকে বেশ খানিকটা সময় নিয়েছে, তাই যদি আপনার কাছে সহজ বা আরও সংক্ষিপ্ততর উপায় না পাওয়া যায় তবে সম্ভবত সবচেয়ে ভাল best

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 80
}



    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: .subtitle, reuseIdentifier: String(describing: ChangesRequiringApprovalTableViewController.self))

    let record = records[indexPath.row]

    cell.textLabel?.text = "Title text"

    if let thumb = record["thumbnail"] as? CKAsset, let image = UIImage(contentsOfFile: thumb.fileURL.path) {
        cell.imageView?.contentMode = .scaleAspectFill
        cell.imageView?.image = image
        cell.imageView?.translatesAutoresizingMaskIntoConstraints = false
        cell.imageView?.leadingAnchor.constraint(equalTo: cell.contentView.leadingAnchor).isActive = true
        cell.imageView?.widthAnchor.constraint(equalToConstant: 80).rowHeight).isActive = true
        cell.imageView?.heightAnchor.constraint(equalToConstant: 80).isActive = true
        if let textLabel = cell.textLabel {
            let margins = cell.contentView.layoutMarginsGuide
            textLabel.translatesAutoresizingMaskIntoConstraints = false
            cell.imageView?.trailingAnchor.constraint(equalTo: textLabel.leadingAnchor, constant: -8).isActive = true
            textLabel.topAnchor.constraint(equalTo: margins.topAnchor).isActive = true
            textLabel.trailingAnchor.constraint(equalTo: margins.trailingAnchor).isActive = true
            let bottomConstraint = textLabel.bottomAnchor.constraint(equalTo: margins.bottomAnchor)
            bottomConstraint.priority = UILayoutPriorityDefaultHigh
            bottomConstraint.isActive = true
            if let description = cell.detailTextLabel {
                description.translatesAutoresizingMaskIntoConstraints = false
                description.bottomAnchor.constraint(equalTo: margins.bottomAnchor).isActive = true
                description.trailingAnchor.constraint(equalTo: margins.trailingAnchor).isActive = true
                cell.imageView?.trailingAnchor.constraint(equalTo: description.leadingAnchor, constant: -8).isActive = true
                textLabel.bottomAnchor.constraint(equalTo: description.topAnchor).isActive = true
            }
        }
        cell.imageView?.clipsToBounds = true
    }

    cell.detailTextLabel?.text = "Detail Text"

    return cell
}

0

নিয়মিত ইউআইটিএবলভিউসেল জিনিসগুলি স্থিত করতে ভাল কাজ করে তবে সেল.আইমেজভিউ আপনার পছন্দ মতো আচরণ করবে বলে মনে হয় না। আমি খুঁজে পেয়েছি যে প্রথমে সেল.আইমেজভিউকে একটি সঠিক আকারের চিত্রের মতো উপহার দিয়ে ইউআইটিএবলভিউসেলকে যথাযথভাবে গুছিয়ে আনা যথেষ্ট সহজ like

// Putting in a blank image to make sure text always pushed to the side.
UIGraphicsBeginImageContextWithOptions(CGSizeMake(kGroupImageDimension, kGroupImageDimension), NO, 0.0);
UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
cell.imageView.image = blank;

তারপরে আপনি নিজের সাথে সঠিকভাবে কাজ করা ইউআইআইমেজভিউটির সাথে সংযোগ স্থাপন করতে পারেন

// The cell.imageView increases in size to accomodate the image given it.
// We don't want this behaviour so we just attached a view on top of cell.imageView.
// This gives us the positioning of the cell.imageView without the sizing
// behaviour.
UIImageView *anImageView = nil;
NSArray *subviews = [cell.imageView subviews];
if ([subviews count] == 0)
{
    anImageView = [[UIImageView alloc] init];
    anImageView.translatesAutoresizingMaskIntoConstraints = NO;
    [cell.imageView addSubview:anImageView];

    NSLayoutConstraint *aConstraint = [NSLayoutConstraint constraintWithItem:anImageView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:cell.imageView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0];
    [cell.imageView addConstraint:aConstraint];

    aConstraint = [NSLayoutConstraint constraintWithItem:anImageView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:cell.imageView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0];
    [cell.imageView addConstraint:aConstraint];

    aConstraint = [NSLayoutConstraint constraintWithItem:anImageView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:kGroupImageDimension];
    [cell.imageView addConstraint:aConstraint];

    aConstraint = [NSLayoutConstraint constraintWithItem:anImageView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:kGroupImageDimension];
    [cell.imageView addConstraint:aConstraint];
}
else
{
    anImageView = [subviews firstObject];
}

চিত্রটি অ্যানিমেজভিউতে সেট করুন এবং এটি আপনি কোনও ইউআইআইমেজভিউয়ের প্রত্যাশা মতো করবেন। আপনি যে চিত্রটিই দেবেন তা নির্বিশেষে আপনি এটি আকার হিসাবে চান Be এটি টেবিল ভিউতে যেতে হবে: সেলফরআরআউটআইডেক্সপথ:


0

এই দ্রষ্টব্যটি অবশ্যই প্রদত্ত রেক্টরের মধ্যে চিত্রটিকে 'অ্যাসপেক্ট ফিট' হিসাবে আঁকবে।

CGSize itemSize = CGSizeMake(80, 80);
UIGraphicsBeginImageContextWithOptions(itemSize, NO, UIScreen.mainScreen.scale);
UIImage *image = cell.imageView.image;

CGRect imageRect;
if(image.size.height > image.size.width) {
    CGFloat width = itemSize.height * image.size.width / image.size.height;
    imageRect = CGRectMake((itemSize.width - width) / 2, 0, width, itemSize.height);
} else {
    CGFloat height = itemSize.width * image.size.height / image.size.width;
    imageRect = CGRectMake(0, (itemSize.height - height) / 2, itemSize.width, height);
}

[cell.imageView.image drawInRect:imageRect];
cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

0

আমারও একই সমস্যা ছিল। যারা উত্তর দিয়েছেন তাদের প্রত্যেককে ধন্যবাদ - আমি এই উত্তরের বেশ কয়েকটি অংশ ব্যবহার করে একসাথে একটি সমাধান পেতে সক্ষম হয়েছি।

আমার সমাধানটি সুইফট 5 ব্যবহার করছে

আমরা যে সমস্যাটি সমাধান করার চেষ্টা করছি তা হ'ল আমাদের মধ্যে বিভিন্ন দিক অনুপাত সহ চিত্র থাকতে পারে TableViewCell তবে আমরা সেগুলি সুসংগত প্রস্থের সাথে রেন্ডার করতে চাই। চিত্রগুলি অবশ্যই কোনও বিকৃতি না দিয়ে পুরো স্থানটি পূরণ করা উচিত fill আমার ক্ষেত্রে, লম্বা, চর্মসার চিত্রগুলির কিছু "ক্রপিং" দিয়ে আমি ভাল ছিলাম, তাই আমি সামগ্রী মোডটি ব্যবহার করেছি.scaleAspectFill

এটি করার জন্য, আমি একটি কাস্টম সাবক্লাস তৈরি করেছি UITableViewCell। আমার ক্ষেত্রে, আমি এটি নামকরণ করেছিStoryTableViewCell । সম্পূর্ণ শ্রেণিটি নীচে আটকানো হয়েছে, কমেন্টস ইনলাইন সহ।

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

ধারাবাহিক চিত্রের প্রস্থ সহ সারণী প্রদর্শন রেন্ডার করা

class StoryTableViewCell: UITableViewCell {

    override func layoutSubviews() {
        super.layoutSubviews()

        // ==== Step 1 ====
        // ensure we have an image
        guard let imageView = self.imageView else {return}

        // create a variable for the desired image width
        let desiredWidth:CGFloat = 70;

        // get the width of the image currently rendered in the cell
        let currentImageWidth = imageView.frame.size.width;

        // grab the width of the entire cell's contents, to be used later
        let contentWidth = self.contentView.bounds.width

        // ==== Step 2 ====
        // only update the image's width if the current image width isn't what we want it to be
        if (currentImageWidth != desiredWidth) {
            //calculate the difference in width
            let widthDifference = currentImageWidth - desiredWidth;

            // ==== Step 3 ====
            // Update the image's frame,
            // maintaining it's original x and y values, but with a new width
            self.imageView?.frame = CGRect(imageView.frame.origin.x,
                                           imageView.frame.origin.y,
                                           desiredWidth,
                                           imageView.frame.size.height);

            // ==== Step 4 ====
            // If there is a texst label, we want to move it's x position to
            // ensure it isn't overlapping with the image, and that it has proper spacing with the image
            if let textLabel = self.textLabel
            {
                let originalFrame = self.textLabel?.frame

                // the new X position for the label is just the original position,
                // minus the difference in the image's width
                let newX = textLabel.frame.origin.x - widthDifference
                self.textLabel?.frame = CGRect(newX,
                                               textLabel.frame.origin.y,
                                               contentWidth - newX,
                                               textLabel.frame.size.height);
                print("textLabel info: Original =\(originalFrame!)", "updated=\(self.textLabel!.frame)")
            }

            // ==== Step 4 ====
            // If there is a detail text label, do the same as step 3
            if let detailTextLabel = self.detailTextLabel {
                let originalFrame = self.detailTextLabel?.frame
                let newX = detailTextLabel.frame.origin.x-widthDifference
                self.detailTextLabel?.frame = CGRect(x: newX,
                                                     y: detailTextLabel.frame.origin.y,
                                                     width: contentWidth - newX,
                                                     height: detailTextLabel.frame.size.height);
                print("detailLabel info: Original =\(originalFrame!)", "updated=\(self.detailTextLabel!.frame)")
            }

            // ==== Step 5 ====
            // Set the image's content modoe to scaleAspectFill so it takes up the entire view, but doesn't get distorted
            self.imageView?.contentMode = .scaleAspectFill;
        }
    }
}

0

আমরা যে সমাধানটি দিয়ে শেষ করেছিলাম তা অন্য অনেকের মতো। তবে বিভাজনের সঠিক অবস্থান পেতে আমাদের ফোন করার আগে সেট করতে হয়েছিল super.layoutSubviews()। সরলীকৃত উদাহরণ:

class ImageTableViewCell: UITableViewCell {

    override func layoutSubviews() {
        separatorInset.left = 70
        super.layoutSubviews()

        imageView?.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
        textLabel?.frame = CGRect(x: 70, y: 0, width: 200, height: 50)
    }

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