मैं UITableViewCell की ImageView छवि के छोटे होने पर भी एक निश्चित आकार कैसे बना सकता हूँ


104

मेरे पास छवियों का एक गुच्छा है जो मैं सेल के छवि दृश्यों के लिए उपयोग कर रहा हूं, वे सभी 50x50 से बड़े नहीं हैं। उदा 40x50, 50x32, 20x37 .....

जब मैं तालिका दृश्य लोड करता हूं, तो पाठ पंक्तिबद्ध नहीं होता है क्योंकि छवियों की चौड़ाई भिन्न होती है। इसके अलावा, मैं बाईं ओर के रूप में केंद्र में दिखाई देने वाली छोटी छवियां चाहूंगा।

यहाँ वह कोड है जो मैं अपने 'cellForRowAtIndexPath' विधि के अंदर आज़मा रहा हूँ

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
@ @ View: इसे काम करने के लिए उपकुलिंग UITableViewCell मुख्य चाल है।
Auco

5
यह मेरे लिए काम नहीं करता है। छवि अभी भी पूरी छवि को देखती है।
जॉसलिनम

14
यह मेरे लिए काम नहीं करता है क्योंकि लेबल गलत हैं।
नवरिनौद

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

या आप @Tommy द्वारा सुझाए गए दूसरे (परीक्षण नहीं किए गए) दृष्टिकोण का उपयोग कर सकते हैं:

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

ऊपर दिया गया कोड ऊपर का Swift 3+ संस्करण है।


3
छवि विरूपण UIGraphicsBeginImageContextWithOptions (आइटमसाइज़, NO, UIScreen.mainScreen.scale) द्वारा तय किया जा सकता है; UIGraphicsBeginImageContext (itemSize) के बजाय;
किरण रूत आर

1
अच्छा उत्तर। BTW, मैं UIScreen.mainScreen.scaleतो मैं बस के साथ चला गया का विकल्प नहीं मिला UIGraphicsBeginImageContext। बेसिक सेल में भी इमेज व्यू का आकार बदला।
डेनिकोव

3
@ DeutschAttanasioRuiz सेल का चयन करने पर यह फिर से मूल के जैसा हो जाता है, क्या यह इस तरह से माना जाता है, कैसे इसे हल किया जाए।
बोनी

6
उन सभी के लिए जो मेरी तरह भ्रमित हो गए थे, आपको संदर्भ की शुरुआत से पहले छवि को सेट करने की आवश्यकता है। यानी सेल .imageView.image = [UIImage imageNamed: @ "my_image.png"];
गाय लोवे

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
यह आज भी सबसे अच्छा समाधान है। धन्यवाद।
रेमी बेलजंती

इन दिनों मैं शायद एक स्टोरीबोर्ड में xib या प्रोटोटाइप सेल के साथ एक कस्टम सेल बनाने की सलाह दूंगा, और एक मानक सेल के इमेजव्यू से असंबंधित पूरे अन्य छवि दृश्य बनाऊंगा। लेकिन यह अभी भी काफी सरल है, मुझे लगता है!
क्रिस

1
मैं एक xib या स्टोरीबोर्ड का उपयोग करने के बजाय कोड के साथ सब कुछ करना चाहता हूं और यह पूरी तरह से काम करता है।
14:81 पर जॉन81

यह उत्तर कुछ भी नहीं करता है अगर w <वांछित, जो मुझे लगता है कि ब्याज का उपयोग मामला है (कम से कम, प्रश्न में)।
नैट

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
यदि आप ARC का उपयोग नहीं कर रहे हैं तो imgView जारी करना न भूलें।
चार्ली मुनरो

14

पूरे सेल को रीमेक करने की आवश्यकता नहीं है। आप अपने सेल की सामग्री को शिफ्ट करने के लिए टेबल व्यू कॉल्स की इंडेंटेशनलेवल और इंडेंटेशनविद संपत्ति का उपयोग कर सकते हैं। फिर आप अपने कस्टम इमेज व्यू को सेल के बाईं ओर जोड़ें।


6

बेहतर एक छवि दृश्य बनाएं और इसे सेल में एक उप दृश्य के रूप में जोड़ें। तब आप वांछित फ्रेम आकार प्राप्त कर सकते हैं।


बस कोशिश की है, यह अच्छी शुरुआत लगती है, लेकिन कोशिकाओं में पाठ अब छवियों को ओवरलैप करता है, मैं सामग्री के दृश्य को दाईं ओर 50 पिक्सेल कैसे स्थानांतरित कर सकता हूं? cell.contentView.bounds = CGRectMake (50, 0, 270, 50); इसका कोई प्रभाव नहीं है
रॉबर्ट

1
सेल डिफ़ॉल्ट दृश्य का उपयोग करने के बजाय, लेबल बनाएं और इसे सेल में उप दृश्य के रूप में जोड़ें, फिर टेक्स्ट को लेबल टेक्स्ट प्रॉपर्टी पर असाइन करें। इसके द्वारा आप अपनी आवश्यकता के अनुसार सेल को डिजाइन कर सकते हैं।
वारियर

यदि आप किसी सेल में शीर्षक, दिनांक, विवरण आदि प्रदर्शित करना चाहते हैं तो यह अधिक उपयोगी होगा।
वारियर

ठीक है, इसलिए मूल रूप से बीमार को प्रोग्राम को रीमेक करने के लिए है। बहुत कठिन नहीं होना चाहिए। सहायता के लिए धन्यवाद।
राबर्ट

6

एक बस स्विफ्ट ,

चरण 1: UITableViewCell
चरण 2 का एक उपक्लास बनाएँ : इस विधि को UITableViewCell के उप-वर्ग में जोड़ें

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

चरण 3: उस SubClass का उपयोग करके सेल ऑब्जेक्ट बनाएँ 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

इसने मेरे लिए तेजी से काम किया:

UITableViewCell का एक उपवर्ग बनाएं (सुनिश्चित करें कि आप स्टोरीबोर्ड में अपने सेल को लिंक करें)

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

CellForRowAtIndexPath में, अपने नए सेल प्रकार के रूप में सेल को हटाएं:

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

स्पष्ट रूप से अपने लेआउट के अनुरूप संख्या मान बदलें


1

मैंने @ DeutschAttanasio के उत्तर का उपयोग करके एक एक्सटेंशन बनाया है। यह एक छवि को वांछित आकार में बदलने के लिए एक विधि प्रदान करता है, और छवि के लिए एक पारदर्शी मार्जिन जोड़ते हुए ऐसा करने के लिए एक अन्य विधि (यह तालिका के विचारों के लिए उपयोगी हो सकती है जहां आप चाहते हैं कि छवि के साथ एक मार्जिन भी हो)।

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करते हैं तो आप imageView पर बाधाओं को सेट कर सकते हैं। यहाँ मैं एक परियोजना में काम कर रहा उदाहरण है। मैंने उपवर्ग से परहेज किया और प्रोटोटाइप कोशिकाओं के साथ स्टोरीबोर्ड बनाने की आवश्यकता नहीं थी, लेकिन मुझे चलने में काफी समय लगा, इसलिए संभवत: केवल तभी उपयोग करना सबसे अच्छा होगा जब आपके लिए कोई सरल या अधिक संक्षिप्त तरीका उपलब्ध न हो।

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

नियमित UITableViewCell चीजों को स्थिति में रखने के लिए अच्छी तरह से काम करता है, लेकिन cell.imageView ऐसा व्यवहार नहीं करता जैसा आप चाहते हैं। मैंने पाया कि UITableViewCell प्राप्त करना काफी सरल है, पहले सेल द्वारा ठीक से बिछाने के लिए। ठीक तरह से आकार की तरह देखें

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

तो फिर तुम सिर्फ अपने ठीक से काम UIImageView के साथ कनेक्ट कर सकते हैं

// 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];
}

छवि को aImageView पर सेट करें और यह वही करेगा जो आप UIImageView से करने की अपेक्षा करते हैं। आकार आप चाहते हैं कि आप इसे छवि की परवाह किए बिना दे। इसे तालिका दृश्य में जाना चाहिए: cellForRowAtIndexPath:


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लेकिन हम चाहते हैं कि वे विभिन्न प्रकारों के साथ प्रस्तुत करें। बेशक, चित्रों को बिना किसी विकृति के प्रस्तुत करना चाहिए और पूरे स्थान को भरना चाहिए। मेरे मामले में, मैं लंबी, पतली छवियों के कुछ "क्रॉपिंग" के साथ ठीक था, इसलिए मैंने सामग्री मोड का उपयोग किया.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)
    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.