如何在标准 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),会自动调整宽度
对不起,这第二种方法也给出了错误......但我成功计算了剩余按钮的位置,就像这样, webViewButton , webViewButton.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 Plus、iPhone 5s、iphone 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?