UITableViewCell中图像的动态帧计算

时间:2014-01-31 23:19:37

标签: ios objective-c cocoa-touch uitableview

我在UITableViewCell上放了几个图标。图标的数量可以在1到6之间变化。图标不应该具有固定的X位置,而是应该考虑单元格空间动态放置它们。因此,如果有3个图标,它们应该看起来以细胞为中心。此外,图标间距也应该有所不同。例如,当它是6个图标时,它们之间的所有边距都会减少,当有3个边距时,边距将会更多,因此X位置也是如此。

请建议一些快速计算此框架的方法。我在iOS 6和iOS 7上运行该应用程序。

这是我到目前为止所尝试过的,但这似乎不适用于图标计数变化。此外,在空间之间不是动态的。

int maxIconTypes = 6;

CGFloat innerPadding = ([self isIOS7]) ? 15.0f : 9.0f;
CGRect adjustedBoundsIOS6 = [self bounds];
CGFloat adjustedWidth = ([self isIOS7]) ? self.bounds.size.width : adjustedBoundsIOS6.size.width;
CGFloat xOrigin = innerPadding;
CGFloat iconViewSize = 25.0f;
CGFloat ySpacer = (self.bounds.size.height - iconSize) / 2;
CGFloat xSpacer = ((adjustedWidth - (innerPadding * 2)) - (maxRequestTypes * iconViewSize)) / (maxIconTypes - 1);

for (NSString *icon in iconList) {
    UIImageView *anIconView = [[UIImageView alloc] initWithImage:[UIImage icon]];
    if (anIconView.image) {
                anIconView.frame = CGRectMake(xOrigin + originPadding, ySpacer, anIconView.image.size.width, anIconView.image.size.height);
                [self.contentView addSubview:anIconView];
                xOrigin  += anIconView.frame.size.width + xSpacer;
    }
}

2 个答案:

答案 0 :(得分:1)

无论你有多少项,如果你想在开始和结束时用半间距等间距,空格数是相同的:

half width full width half

half width full width full width half

因此,您只需要知道可用的全宽和项目的组合宽度。一个简单的乘法(得到项目的组合宽度)和减去(从可用的全宽度)给出“间隔”的剩余宽度。除以获得xSpacer的项目数,将初始xOrigin设置为xSpacer * 0.5

答案 1 :(得分:0)

这是Wain解释的一个例子:

//Im doing this in a UIView rather than in a UITableViewCell but idea is the same
int cellWidth = CGRectGetWidth(self.view.bounds);

//num of icons
int iconCount = 6;

//size of icon
int iconSize = 25;

//The max padding we can have
float maxPadding = (cellWidth - (iconSize * iconCount)) / iconCount;

//Our offset
float xOrigin = maxPadding / 2;

//Loooop
for (int i = 0; i < iconCount; i++) {
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(xOrigin, self.view.center.y, iconSize, iconSize)];

    xOrigin += (iconSize + maxPadding);

    label.backgroundColor = [UIColor blueColor];
    [self.view addSubview:label];
}