0

このカスタムグリッドビューをコードで使用しましたが、次のようなグリッドビューを作成したいと思います。 ここに画像の説明を入力してください

コードでこれをどのように行う必要がありますか?アイテムの設定方法は次のとおりです。

- (void)setupItemViews {
for (UIView *view in self.itemViews) {
    [view removeFromSuperview];
}
for (UIImageView *image in self.images) {
    [image removeFromSuperview];
}

[self.images removeAllObjects];
[self.itemViews removeAllObjects];

// now add the new objects
NSUInteger numItems = [self.menuDelegate menuViewNumberOfItems:self];

for (NSUInteger i = 0; i < numItems; i++) {
    GridMenuItemView *itemView = [[GridMenuItemView alloc] init];

    GridMenuItem *menuItem = [self.menuDelegate menuView:self itemForIndex:i];

    itemView.frame = CGRectMake(0, 0, self.itemSize.width, self.itemSize.height);
    itemView.label.text = menuItem.title;
    //itemView.imageView.image = menuItem.icon;
    itemView.tag = i;

    [itemView addTarget:self
                 action:@selector(itemPressed:) 
       forControlEvents:UIControlEventTouchUpInside];

    [itemView setBackgroundImage:[UIImage imageNamed:menuItem.normalImageName]
                        forState:UIControlStateNormal];
    [itemView setBackgroundImage:[UIImage imageNamed:menuItem.highlightedImageName]
                        forState:UIControlStateHighlighted];

    NSUInteger numColumns = self.bounds.size.width > self.bounds.size.height ? self.columnCountLandscape : self.columnCountPortrait;


    [self.itemViews addObject:itemView];
    [self addSubview:itemView];


}

ctraheyのおかげで、私は欲しいものを手に入れました。ただし、セルの設定に使用される方法は次の-(void) layoutSubviewsとおりです。

次の行の後に対応するコードがあります**//__n__ ... 。-(void)layoutSubviews {[super layoutSubviews]; // [self removeFromSuperview];

NSUInteger numColumns = self.bounds.size.width > self.bounds.size.height ? self.columnCountLandscape : self.columnCountPortrait;

NSUInteger numItems = [self.menuDelegate menuViewNumberOfItems:self];
if (self.itemViews.count != numItems) {
    [self setupItemViews];
}

CGFloat padding = roundf((self.bounds.size.width - (self.itemSize.width * numColumns)) / (numColumns + 1));
NSUInteger numRows = numItems % numColumns == 0 ? (numItems / numColumns) : (numItems / numColumns) + 1;

CGFloat yPadding = 0;
CGFloat totalHeight = ((self.itemSize.height + yPadding) * numRows) + yPadding ;

// get an even y padding if less than the max number of rows

if (totalHeight < self.bounds.size.height) {
    CGFloat leftoverHeight = self.bounds.size.height - totalHeight;
    CGFloat extraYPadding = roundf(leftoverHeight / (numRows + 1));
    yPadding += extraYPadding;

    totalHeight = ((self.itemSize.height + yPadding) * numRows) + yPadding;
}

// get an even x padding if we have less than a single row of items
if (numRows == 1 && numItems < numColumns) {
    padding = roundf((self.bounds.size.width - (numItems * self.itemSize.width)) / (numItems + 1));
}

for (int i = 0, j = numColumns; i < numItems; i++) {

    j--;
    if (j<0) {
        j += numColumns;
    }
    //NSUInteger column = j ;
    //NSUInteger row = i / numColumns;
    UIView *item = [self.itemViews objectAtIndex:i];


    //CGFloat xOffset = (column * (self.itemSize.width + padding)) + padding;
    //CGFloat yOffset = (row * (self.itemSize.height + yPadding));// + yPadding;


    **//__n__ These three lines of code make set the cell items at different xPositions from right and left.  
    CGFloat xPosition = (i%2) ? 0.0 : self.bounds.size.width - self.itemSize.width;
    CGFloat yPosition = i*self.itemSize.height;
    item.frame = CGRectMake(xPosition, yPosition, self.itemSize.width, self.itemSize.height);**

    //item.frame = CGRectMake(xOffset, yOffset, self.itemSize.width, self.itemSize.height);

  //  if ((i%numColumns) == 0) {
     //   UIImageView *img = [self.images objectAtIndex:i/numColumns];
     //   img.frame = CGRectMake(0, yOffset+76, self.bounds.size.width, 1);


 //   }//End If
}
    //Scroll size.
UIDeviceOrientation currentOrientation = [[UIDevice currentDevice] orientation];


if (UIDeviceOrientationIsPortrait(currentOrientation))
{
    self.contentSize = CGSizeMake(self.bounds.size.width, totalHeight + (yPadding * (numRows+1.55)));
}


else if (UIDeviceOrientationIsLandscape(currentOrientation))
{

    self.contentSize = CGSizeMake(self.bounds.size.width, totalHeight + (yPadding * (numRows+3)));
}

}

4

3 に答える 3

1

私があなたの意図を正しく理解しているなら、次の行は次のとおりです。

itemView.frame = CGRectMake(0, 0, self.itemSize.width, self.itemSize.height);

ビューを配置するために、インデックスiといくつかの簡単な算術を使用する必要があります。私が過去に使用した手法の1つは、剰余演算子を使用した単純な奇数チェックです。

CGFloat xPosition = (i%2) ? 0.0 : self.bounds.size.width - self.itemSize.width;
CGFloat yPosition = i*self.itemSize.height;
itemView.frame = CGRectMake(xPosition, yPosition, self.itemSize.width, self.itemSize.height);
于 2012-06-17T07:47:31.170 に答える
0

ctraheyに感謝します。セルの設定方法は次の-(void) layoutSubviewsとおりです。

次の行の後に対応するコードがあります**//__n__ ... 。-(void)layoutSubviews {[super layoutSubviews]; // [self removeFromSuperview];

NSUInteger numColumns = self.bounds.size.width > self.bounds.size.height ? self.columnCountLandscape : self.columnCountPortrait;

NSUInteger numItems = [self.menuDelegate menuViewNumberOfItems:self];
if (self.itemViews.count != numItems) {
    [self setupItemViews];
}

CGFloat padding = roundf((self.bounds.size.width - (self.itemSize.width * numColumns)) / (numColumns + 1));
NSUInteger numRows = numItems % numColumns == 0 ? (numItems / numColumns) : (numItems / numColumns) + 1;

CGFloat yPadding = 0;
CGFloat totalHeight = ((self.itemSize.height + yPadding) * numRows) + yPadding ;

// get an even y padding if less than the max number of rows

if (totalHeight < self.bounds.size.height) {
    CGFloat leftoverHeight = self.bounds.size.height - totalHeight;
    CGFloat extraYPadding = roundf(leftoverHeight / (numRows + 1));
    yPadding += extraYPadding;

    totalHeight = ((self.itemSize.height + yPadding) * numRows) + yPadding;
}

// get an even x padding if we have less than a single row of items
if (numRows == 1 && numItems < numColumns) {
    padding = roundf((self.bounds.size.width - (numItems * self.itemSize.width)) / (numItems + 1));
}

for (int i = 0, j = numColumns; i < numItems; i++) {

    j--;
    if (j<0) {
        j += numColumns;
    }
    //NSUInteger column = j ;
    //NSUInteger row = i / numColumns;
    UIView *item = [self.itemViews objectAtIndex:i];


    //CGFloat xOffset = (column * (self.itemSize.width + padding)) + padding;
    //CGFloat yOffset = (row * (self.itemSize.height + yPadding));// + yPadding;


    **//__n__ These three lines of code make set the cell items at different xPositions from right and left.  
    CGFloat xPosition = (i%2) ? 0.0 : self.bounds.size.width - self.itemSize.width;
    CGFloat yPosition = i*self.itemSize.height;
    item.frame = CGRectMake(xPosition, yPosition, self.itemSize.width, self.itemSize.height);**

    //item.frame = CGRectMake(xOffset, yOffset, self.itemSize.width, self.itemSize.height);

  //  if ((i%numColumns) == 0) {
     //   UIImageView *img = [self.images objectAtIndex:i/numColumns];
     //   img.frame = CGRectMake(0, yOffset+76, self.bounds.size.width, 1);


 //   }//End If
}
    //Scroll size.
UIDeviceOrientation currentOrientation = [[UIDevice currentDevice] orientation];


if (UIDeviceOrientationIsPortrait(currentOrientation))
{
    self.contentSize = CGSizeMake(self.bounds.size.width, totalHeight + (yPadding * (numRows+1.55)));
}


else if (UIDeviceOrientationIsLandscape(currentOrientation))
{

    self.contentSize = CGSizeMake(self.bounds.size.width, totalHeight + (yPadding * (numRows+3)));
}

}

于 2012-06-17T12:22:16.880 に答える
0

uitableview操作を使用するだけです。そのcellforrowatindexpathで

奇数と偶数に基づいてボタンの画像とフレームを設定します

 if(indexpath.orw%2==0)
    {
    //set your frame here;

    }
    else
    {
   // set your frame here;
    }
于 2012-06-17T07:48:59.570 に答える