0

我尝试添加custom buttoncustom UICollectionViewCell调整大小UICollectionViewCell,它是利用自动版式

因为我不能在Interface Builder中添加自定义按钮(需要用特定的方法来ALLOC吧)的内容,我加入一个UIView作为一个占位符,它有一个清晰的背景(在这个问题中用于演示黑色)。

这是它的样子:

enter image description here

然后在自定义类代码为UICollectonViewCell我做的:

- (void)awakeFromNib { 
// Initialization code 
self.btnAddOrRemove = [[HTPressableButton alloc] initWithFrame:self.btnContainerView.bounds buttonStyle:HTPressableButtonStyleRounded]; 
self.btnAddOrRemove.center = CGPointMake(self.center.x, self.btnAddOrRemove.center.y); 
//self.btnContainerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
} 

- (void)layoutSubviews 
{ 
[super layoutSubviews]; 

CGRect bounds = self.bounds; 
if (self.shadowWidth != bounds.size.width) 
{ 
    if (self.shadowWidth == 0) 
    { 
     [self.layer setMasksToBounds:NO ]; 
     [self.layer setShadowColor:[[UIColor blackColor ] CGColor ] ]; 
     [self.layer setShadowOpacity:0.5 ]; 
     [self.layer setShadowRadius:5.0 ]; 
     [self.layer setShadowOffset:CGSizeMake(0 , 0) ]; 
     self.layer.cornerRadius = 5.0; 
    } 
    [self.layer setShadowPath:[[UIBezierPath bezierPathWithRect:bounds ] CGPath ] ]; 

    if ([ChosenCategory getInstance].doesExist) { 
     if ([ChosenCategory getInstance].category == self.ingredientCategory) { 
      [self.btnAddOrRemove setTitle:NSLocalizedString(@"Edit profile", nil) forState:UIControlStateNormal]; 
      [self.btnAddOrRemove setButtonColor:[UIColor ht_mediumColor]]; 
      [self.btnAddOrRemove setShadowColor:[UIColor ht_mediumDarkColor]]; 
      [self.btnAddOrRemove setTitleColor:[UIColor ht_ashColor] forState:UIControlStateNormal]; 
      [self.btnAddOrRemove setTitleColor:[UIColor ht_ashColor] forState:UIControlStateHighlighted]; 
      [self.btnAddOrRemove addTarget:self action:@selector(toDetail:) forControlEvents:UIControlEventTouchUpInside]; 
     } 
     else { 
      [self.btnAddOrRemove setTitle:NSLocalizedString(@"Choose Profile", nil) forState:UIControlStateNormal]; 
      [self.btnAddOrRemove setButtonColor:[UIColor ht_bitterSweetColor]]; 
      [self.btnAddOrRemove setShadowColor:[UIColor ht_bitterSweetDarkColor]]; 
      [self.btnAddOrRemove setTitleColor:[UIColor ht_ashColor] forState:UIControlStateNormal]; 
      [self.btnAddOrRemove setTitleColor:[UIColor ht_ashColor] forState:UIControlStateHighlighted]; 
      [self.btnAddOrRemove addTarget:self action:@selector(chosenProfile:) forControlEvents:UIControlEventTouchUpInside]; 
     } 
    } 
    else { 
     [self.btnAddOrRemove setTitle:NSLocalizedString(@"Choose profile", nil) forState:UIControlStateNormal]; 
     [self.btnAddOrRemove setButtonColor:[UIColor ht_mediumColor]]; 
     [self.btnAddOrRemove setShadowColor:[UIColor ht_mediumDarkColor]]; 
     [self.btnAddOrRemove setTitleColor:[UIColor ht_ashColor] forState:UIControlStateNormal]; 
     [self.btnAddOrRemove setTitleColor:[UIColor ht_ashColor] forState:UIControlStateHighlighted]; 
     [self.btnAddOrRemove addTarget:self action:@selector(chosenProfile:) forControlEvents:UIControlEventTouchUpInside]; 
    } 

    [self.btnContainerView addSubview:self.btnAddOrRemove]; 

    self.shadowWidth = bounds.size.width; 
    self.lblSummary.preferredMaxLayoutWidth = self.lblSummary.frame.size.width; 
} 
} 

enter image description here

但你可以看到自定义按钮没有得到containerView的全部宽度。它也没有正确居中。

所以我有2个问题:

1)如何添加自定义按钮,它使用了容器的UIView的全宽视图,而使用自动版式。

2)有没有一种方法可以将空白添加到卡的左侧和右侧?

+0

您在第一个问题中说“使用自动布局时”,但没有在按钮和其容器之间使用自动布局。不要设置按钮的框架,而应将其固定到容器视图的所有四边,并带有约束条件。 – rdelmar 2015-02-05 17:28:38

+0

@rdelmar谢谢你的回答。我怎么能这样做? – Galip 2015-02-05 17:48:00

回答

1

因为你在所有其他视图上使用约束,我建议你对按钮做同样的操作。而不是使用静态框架,你可以尝试使用一些视觉上的布局限制设置你的按钮

- (void)awakeFromNib 
{ 

    self.btnAddOrRemove = [[HTPressableButton alloc] initWithFrame:self.btnContainerView.bounds buttonStyle:HTPressableButtonStyleRounded]; 
    [self.btnContainerView addSubView:self.btnAddOrRemove]; 
    [self.btnAddOrRemove setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.btnAddOrRemove addConstraintsToFillParentHorizontally:self.btnContainerView] 
    [self.btnAddOrRemove addConstraintsToFillParentVertically:self.btnContainerView] 
} 

- (void)addConstraintsToFillParentHorizontally:(UIView *)parentView 
{ 
    [parentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:@{ @"view": self }]]; 
} 

- (void)addConstraintsToFillParentVertically:(UIView *)parentView 
{ 
    [parentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:@{ @"view": self }]]; 
} 

帧这应该使按钮的帧匹配容器视图的一个。然后,你仍然需要做的是在layoutSubviews方法中应用圆角。

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
    if (self.shadowWidth == 0) 
    { 
     [self.layer setMasksToBounds:NO ]; 
     [self.layer setShadowColor:[[UIColor blackColor] CGColor]]; 
     [self.layer setShadowOpacity:0.5 ]; 
     [self.layer setShadowRadius:5.0 ]; 
     [self.layer setShadowOffset:CGSizeMake(0, 0)]; 
     self.layer.cornerRadius = 5.0; 
    } 
    [self.layer setShadowPath:[[UIBezierPath bezierPathWithRect:bounds ] CGPath ] ]; 
} 

希望它有效!

+0

感谢您的回答,但我选择实现了一个不同的库,使我能够在Interface Builder中声明自定义按钮,因此问题不再存在。我的第二个问题仍然存在,但(如何减少自定义'卡'的宽度) – Galip 2015-02-09 14:02:51

1

其实你可以离开这个按钮,因为它是,如果你想,只要将占位视图背景颜色为透明

UIColor.clearcolor() 

和居中的底部放UIButton矩形同样大小的占位符视图,然后设置内容你的按钮模式进入背景图像里面!

contentMode = UIViewContentMode.Center