无法在 uiview 中动态居中自定义 uibutton

Posted

技术标签:

【中文标题】无法在 uiview 中动态居中自定义 uibutton【英文标题】:Unable to center a custom uibutton within a uiview dynamically 【发布时间】:2015-10-26 05:59:33 【问题描述】:

这就是我正在做的事情。我在 UITableView 的一行中有一个 UITableViewCell

我现在创建了一个 UIView 并将其作为子视图添加到 UITableViewCell。在 UIView 中我创建了一个自定义按钮并希望位于 UIView 的中心,但是当我将其居中时,按钮会从 UIView 中消失。

为了更好地理解,我为所附图像提供了背景颜色。

灰色:自定义 UIButton 红色:UIView 绿色:UITableViewCell 蓝色:绿色上方的标签

居中按钮之前:

中心按钮后:

这是居中后相同的代码:

tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath: 

NSString *cellidentifier=@"cell";
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellidentifier];
if(cell==nil)
    cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];


cell.backgroundColor = [UIColor greenColor];

//adding deviceName label
SFIDevice *device=(SFIDevice *)[self.deviceArray objectAtIndex:indexPath.row];
UIFont *font = [UIFont fontWithName:@"Avenir-Heavy" size:14];
UILabel *deviceNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(cell.frame.origin.x, cell.frame.origin.y, self.view.frame.size.width, 25)];
deviceNameLabel.text = device.deviceName;
deviceNameLabel.textAlignment=UITextAlignmentCenter;
deviceNameLabel.font=font;
deviceNameLabel.backgroundColor = [UIColor blueColor];
[cell addSubview:deviceNameLabel];

SensorIndexSupport *Index=[[SensorIndexSupport alloc]init];
NSArray *deviceIndexes=[Index getIndexesFor:device.deviceType];

UIView *cellView = [self addMyButton:cell withYScale:25  withDeviceIndex:deviceIndexes];
cellView.backgroundColor = [UIColor redColor];

return cell;

调用添加我的按钮:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(cellFrame.frame.origin.x,
                                                              yScale,
                                                              self.view.frame.size.width,
                                                              frameSize)];
[cellFrame addSubview:view];
int i=0;
for (SFIDeviceIndex *deviceIndex in deviceIndexes) 
    for (IndexValueSupport *iVal in deviceIndex.indexValues) 
        i++;

        SFIRulesSwitchButton *btnBinarySwitchOn = [[SFIRulesSwitchButton alloc] initWithFrame:CGRectMake(0,0, frameSize, frameSize)];
        SFIDimmerButton *dimbtn=[[SFIDimmerButton alloc]initWithFrame:CGRectMake(view.frame.origin.x,view.frame.origin.y, dimFrameWidth, dimFrameHeight)];
        btnBinarySwitchOn.backgroundColor = [UIColor blueColor];

        btnBinarySwitchOn.selected = NO;
        [btnBinarySwitchOn addTarget:btnBinarySwitchOn action:@selector(onButtonClick) forControlEvents:UIControlEventTouchUpInside];
        [btnBinarySwitchOn setupValues:[UIImage imageNamed:iVal.iconName] Title:iVal.displayText];

        btnBinarySwitchOn.frame = CGRectMake(btnBinarySwitchOn.frame.origin.x + ((i-1) * (frameSize/2))+textHeight/2 ,
                                             btnBinarySwitchOn.frame.origin.y,
                                             btnBinarySwitchOn.frame.size.width,
                                             btnBinarySwitchOn.frame.size.height);

        btnBinarySwitchOn.center = view.center;
        [view addSubview:btnBinarySwitchOn];

    


return view;

按钮居中的代码:

btnBinarySwitchOn.center = view.center;  

【问题讨论】:

我认为这是因为您为 btnBinarySwitchOn 设置的框架。 @PK20 将其注释掉并检查。还是一样 如果这不是原因,请检查您的 UIView 框架。 这个link 有更多关于 UIView 框架、外滩和中心的信息 @PK20 我将 UIView 的 xy 坐标更改为 (0,0) 并且按钮在中心位置很好,但我想要类似 (0, 25) 的东西,这使得按钮走出 UIView 【参考方案1】:

我认为问题出在这一行btnBinarySwitchOn.center = view.center;

也许这就是你想要的:

btnBinarySwitchOn.center = CGPointMake(view.frame.size.width/2,
                                       view.frame.size.height/2);

【讨论】:

你应该使用boundsnotframe,因为如果视图有一个transform,框架是未定义的。 @anhtu:谢谢!它起作用了,你能解释一下可能发生的事情吗? @PK20:当然,我会看看边界。是的,当我旋转屏幕时,视图没有拉伸,没有边界或框架 @Masood view.center 的值是view's center in view's superview的值。它不是视图的中心 @Masood 尝试登录 view.centerCGPointMake(view.frame.size.width/2, view.frame.size.height/2) 看看会发生什么。 :)

以上是关于无法在 uiview 中动态居中自定义 uibutton的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局将自定义 UIView 绘制为背景并将其居中

在自定义 UITableViewCell 中动态显示按钮

在 UIView 中动态居中对齐多个不同大小的 UIButton

在用户选择/在 ios swift 中突出显示时动态删除自定义 UIView

iOS 7 - 自定义 UIView 的动态壁纸行为

出现键盘时无法上移自定义 UIView