簡體   English   中英

如何在表格視圖單元格中獲取自定義UIView

[英]How do i get custom UIView in table view cell

在它是常規UIImage之前,我在nd iOS 8.2應用程序的原型單元中有一個Custom UIView並且我使用[currentCell viewWithTag:200]可以使它恢復正常。 在我的UITableView cellForRowIndexPath方法中。 但是在我做了一個自定義的uiview並替換了uiimage之后,它總是返回nil。

編輯在嘗試向工作菜單控制器添加新標簽后,這種方法更加簡單,只需遍歷字符串數組即可。 並設置標簽,然后在循環中(已經為菜單打印了正確的值),找不到新添加的標簽。 是否有可能以某種方式無法編譯標簽?

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

static NSString *CellIdentifier = @"Cell";
UITableViewCell *currentCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
Lists *listItem = [lists objectAtIndex:indexPath.row];

if(currentCell == nil){
    currentCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

//THIS ALLWAYS RETUNS nil
ShadedBadgeImage *cellImage = (ShadedBadgeImage *)[currentCell viewWithTag:200];
//UIView *cellImage = (UIView *)[currentCell viewWithTag:200];
//cellImage.completedProcentage = 2.0 * listItem.id.doubleValue;


UILabel *cellTitle = (UILabel *) [currentCell viewWithTag:101];
UILabel *cellDescription = (UILabel *)[currentCell viewWithTag:102];

cellTitle.text = listItem.id.stringValue;
cellDescription.text = listItem.shortText;

return currentCell;

和我的自定義uiview。 使用layoutSubviews渲染蒙版的圖像和進度條。

IB_DESIGNABLE

@implementation ShadedBadgeImage {

    double lineWidth;
    CAShapeLayer *backgroundLayer;
    CAShapeLayer *coloredLayer;
    CALayer *imageLayer;

}
    - (void)baseInit {
        lineWidth = 5.0;
        [self updateStroke];
    }

    - (id)initWithFrame:(CGRect)frame
    {

        self = [super initWithFrame:frame];
        if (self) {
            [self baseInit];
        }
        return self;
    }

    - (id)initWithCoder:(NSCoder *)aDecoder {
        if ((self = [super initWithCoder:aDecoder])) {
            [self baseInit];
        }
        return self;
    }

    - (void)layoutSubviews {
        [super layoutSubviews];

        //Adds the background ring layer
        if(backgroundLayer == nil)
        {
            backgroundLayer = [[CAShapeLayer alloc] init];

            CGRect rect = CGRectInset(self.bounds, lineWidth/2.0, lineWidth/2.0);
            UIBezierPath *roundPath = [UIBezierPath bezierPathWithOvalInRect:rect];

            backgroundLayer.path = roundPath.CGPath;
            backgroundLayer.fillColor = nil;
            backgroundLayer.lineWidth = lineWidth;
            backgroundLayer.strokeColor = [UIColor colorWithWhite:0.5 alpha:0.05].CGColor;

            [self.layer addSublayer:backgroundLayer];
        }
        backgroundLayer.frame = self.layer.frame;

        //Adds the color ring layer
        if(coloredLayer == nil)
        {
            coloredLayer = [[CAShapeLayer alloc] init];

            CGRect rect = CGRectInset(self.bounds, lineWidth/2.0, lineWidth/2.0);
            UIBezierPath *roundPath = [UIBezierPath bezierPathWithOvalInRect:rect];

            coloredLayer.path = roundPath.CGPath;
            coloredLayer.fillColor = nil;
            coloredLayer.lineWidth = lineWidth;
            coloredLayer.strokeColor = [UIColor blueColor].CGColor;

            coloredLayer.anchorPoint = CGPointMake(0.5, 0.5);
            coloredLayer.transform = CATransform3DRotate(coloredLayer.transform, -M_PI/2, 0, 0, 1);

            [self.layer addSublayer:coloredLayer];
        }
        coloredLayer.frame = self.layer.frame;

        //Adds the color ring layer
        if(imageLayer == nil)
        {
            CAShapeLayer *imageMask = [[CAShapeLayer alloc] init];
            CGRect insertBounds = CGRectInset(self.bounds, lineWidth + 3.0, lineWidth + 3.0);
            UIBezierPath *innerPath = [UIBezierPath bezierPathWithOvalInRect:insertBounds];

            imageMask.path = innerPath.CGPath;
            imageMask.fillColor =  [UIColor grayColor].CGColor;
            imageMask.frame = self.bounds;
            [self.layer addSublayer:imageMask];


            imageLayer = [[CALayer alloc] init];
            imageLayer.mask = imageMask;
            imageLayer.frame = self.layer.frame;
            imageLayer.backgroundColor =[UIColor grayColor].CGColor;
            imageLayer.contentsGravity = kCAGravityResizeAspectFill;

            [self.layer addSublayer:imageLayer];
        }
        [self updateStroke];
    }

    - (void) updateStroke{
        if (coloredLayer != nil)
        {
            coloredLayer.strokeEnd = self.completedProcentage;
        }

        if(self.image != nil)
        {
            imageLayer.contents = (__bridge id)([self.image CGImage]);
        }
    }   
    @end

就像評論說的那樣,不要使用標簽來定制UITableCellViews以獲得更多控制

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM