如何在标准 UITableViewCell 中以编程方式自动布局右侧的自定义 UIButton。

Posted

技术标签:

【中文标题】如何在标准 UITableViewCell 中以编程方式自动布局右侧的自定义 UIButton。【英文标题】:How to Autolayout Programatically in Standard UITableViewCell for custom UIButton in Right side. 【发布时间】:2017-03-16 04:42:11 【问题描述】:

首先我必须以编程方式而不是在情节提要中解决这个布局问题,因为我已经通过编码而不是通过情节提要拖放来定义我的按钮,

我编写了通用 ios 应用程序,其中我有几个 TableView。我必须在每个UITableViewCell 右侧添加一些自定义按钮,或者你可以说我必须在单元格的trailing 边缘添加按钮,它在模拟器的 iPhone7 Plus 中工作得很好,但是 iPhone 5 呢还是 5s 和其他 iOS 设备?这是它在 iphone7 Plus 和 iphone 5s 中的外观

我应该在我的程序(代码)中对布局进行什么样的审核,这是我在UITableViewCell 方法中的代码,用于在 cellForRowAtIndexPath 方法中定义 4 个按钮,

//Favorite Button

    UIButton *addtoFavsButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [addtoFavsButton setImage:[UIImage imageNamed:@"like"] forState:UIControlStateNormal];
    addtoFavsButton.frame = CGRectMake(370.0f, 0.0f, 50.0f, 45.0f); 
    [cell addSubview:addtoFavsButton];
    [addtoFavsButton addTarget:self
                        action:@selector(addtoFavs:)
              forControlEvents:UIControlEventTouchUpInside];
    [cell.contentView addSubview:addtoFavsButton];
    [addtoFavsButton setTag:indexPath.row];

// WebView Button

UIButton *webViewButton = [UIButton buttonWithType:UIButtonTypeCustom];
[webViewButton setImage:[UIImage imageNamed:@"web"] forState:UIControlStateNormal];
webViewButton.frame = CGRectMake(335.0f, 0.0f, 50.0f, 50.0f);
[cell addSubview:webViewButton];
[webViewButton addTarget:self
                  action:@selector(webView:)
        forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:webViewButton];
[webViewButton setTag:indexPath.row];


// Twitter Share Button

UIButton *twitterButton = [UIButton buttonWithType:UIButtonTypeCustom];
[twitterButton setImage:[UIImage imageNamed:@"twitter"] forState:UIControlStateNormal];
twitterButton.frame = CGRectMake(300.0f, 0.0f, 45.0f, 42.0f);
[cell addSubview:twitterButton];
[twitterButton addTarget:self action:@selector(twitterShare:event:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:twitterButton];
//[twitterButton setTag:indexPath.row];


// Facebook Share Button

UIButton *facebookButton = [UIButton buttonWithType:UIButtonTypeCustom];
[facebookButton setImage:[UIImage imageNamed:@"facebook"] forState:UIControlStateNormal];
facebookButton.frame = CGRectMake(265.0f, 0.0f, 45.0f, 42.0f);
[cell addSubview:facebookButton];
[facebookButton addTarget:self
                   action:@selector(facebookShare:event:)
         forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:facebookButton];

建议我如何对这些按钮进行自动布局编程,以便在任何 iOS 设备中从右侧开始调整所有按钮。

【问题讨论】:

我认为不需要自动布局,只需根据设备宽度计算框架 我添加了我的答案 【参考方案1】:

如果您不使用自动布局,请按照我的回答进行操作

第一步

创建一个宏来定义设备宽度

#define WidthCalculation self.view.frame.size.width

第二步

最初为您的 addtoFavsButton 设置框架,它会自动调整屏幕宽度

addtoFavsButton.frame = CGRectMake(WidthCalculation - 60, 0.0f, 50.0f, 45.0f);

然后根据 addtoFavsButton 计算其他按钮

webViewButton.frame = CGRectMake(WidthCalculation - (addtoFavsButton.frame.origin.x + 50.0f +10), 0.0f, 50.0f, 50.0f);

【讨论】:

Step2,第一行给出了准确的结果,但我试图将按钮移动到更右侧,所以我用(WidthCalculation - 45, 0.0f, 50.0f, 45.0f);替换了(WidthCalculation - 60, 0.0f, 50.0f, 45.0f);,它在iphone 7Plus和iphone 5s上都给出了准确的结果,但是第二行没有给出舒适的结果,它在最左边的方向上给出了按钮,即UITableViewCell的起点,所以我尝试一次又一次地更改和恢复值以获得一些舒适的结果,它如何与以下值一起工作。 由于剩余字符少,请继续阅读下一条评论 抱歉以上一半评论 (addtoFavsButton.frame.origin.x - 200), 0.0f, 50.0f, 50.0f); 这个东西给了我在 iPhone 5s 中的第二个 webViewButton 的确切位置,当我在 iphone 7Plus 中尝试它时它没有给我准确的附近位置,即跳过比预期更多的空间……有什么想法吗? addtoFavsButton.frame.origin.x - (webViewButton.size.width + 10),会自动调整宽度 对不起,这第二种方法也给出了错误......但我成功计算了剩余按钮的位置,就像这样, webViewButtonwebViewButton.frame = CGRectMake(WidthCalculation - 75, 0.0f, 50.0f, 45.0f);twitterButton , twitterButton.frame = CGRectMake(WidthCalculation - 105, 0.0f, 45.0f, 42.0f); , facebookButton , ` facebookButton.frame = CGRectMake(WidthCalculation - 140, 0.0f, 45.0f, 42.0f);` 并在三种不同的设备上进行了测试,即 iphone 7 PlusiPhone 5siphone SE。它在纵向时提供所需的位置,但在横向中间时 当我让我的设备横屏时,所有按钮都靠近中间,但不在同一个右端位置。但是它仍然比以前更好,因为当我将设备从 7plus 切换到 5s 时它不能正常工作,我们还能让它变得更好吗?我的意思是我可以在横向时将按钮移动到相同的位置吗?还是现在我必须继续前进?我还没有在 ipad 上测试过它,但我认为在 iPad 上它们的位置也会像 iPhone 设备上的横向或 iPhone 上的纵向一样......关于我的查询有什么想法吗?【参考方案2】:

您正在设置这些按钮的框架,以便无论设备的宽度如何,按钮都会将自身置于其框架变量中定义的 (x,y) 坐标中。因此,您必须为这些按钮添加自动布局约束,才能在所有设备中正确获得所需的设计。

使用 NSLayoutConstraint 对象创建您需要的自动布局约束并将其添加到按钮中。 参考这个链接:

http://www.tutorialspoint.com/ios/ios_auto_layouts.htm

【讨论】:

感谢您的回答,但这不是重点,但很有帮助,并提供了有关所需查询的大量信息.. 去投票

以上是关于如何在标准 UITableViewCell 中以编程方式自动布局右侧的自定义 UIButton。的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中以编程方式更改自定义 UITableViewCell 中按钮的背景颜色?

在 Swift 中以编程方式突出显示 UITableViewCell

当 UIStepper 在 Swift 4 中以编程方式点击时如何更改 UILabel 的文本,如果它们都在 UITableViewCell 中?

Swift 在 UITableViewCell 中以正确的方式使用 UISlider?

如何在 UITableView Cell 中以编程方式创建 n 个 UIButton?

无法在 UITableViewCell 中以编程方式创建的 UIButton 上设置图像