首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

向自定义UIButton添加约束不起作用

是因为UIButton是继承自UIView的子类,它有自己的内部布局机制。当我们使用Auto Layout来布局UIButton时,需要注意以下几点:

  1. UIButton的intrinsicContentSize:UIButton会根据其内部的内容(例如文本、图像等)自动计算并设置自身的intrinsicContentSize。这意味着,如果我们直接添加约束来改变UIButton的大小,可能会被intrinsicContentSize所覆盖,导致约束不起作用。
  2. Content Compression Resistance和Content Hugging Priority:UIButton有两个重要的属性,即Content Compression Resistance和Content Hugging Priority。它们决定了UIButton在自动布局过程中的优先级。如果Content Compression Resistance较高,UIButton会更倾向于保持其内部内容的原始大小,而不会被约束所改变。如果Content Hugging Priority较高,UIButton会更倾向于缩小其内部内容以适应约束。

解决向自定义UIButton添加约束不起作用的方法如下:

  1. 使用UIButton的contentEdgeInsets属性:contentEdgeInsets属性可以用来设置UIButton内部内容的边距。通过调整这些边距,可以间接地改变UIButton的大小。例如,如果想要增大UIButton的宽度,可以设置contentEdgeInsets.left和contentEdgeInsets.right的值为负数。
  2. 使用UIButton的titleLabel和imageView属性:UIButton有一个titleLabel和一个imageView,可以通过调整它们的约束来改变UIButton的大小。例如,可以设置titleLabel的leading和trailing约束,使其与UIButton的边缘保持一定的距离,从而改变UIButton的宽度。
  3. 使用自定义的UIButton子类:如果以上方法无法满足需求,可以考虑创建一个自定义的UIButton子类,并在其中重写intrinsicContentSize方法。通过在该方法中返回所需的大小,可以实现自定义UIButton的布局。

腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅供参考,具体产品选择应根据实际需求进行评估。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS开发之微信聊天工具栏的封装

为了屏幕的适配,适应不同屏幕的手机,所以在封装组件的时候是少不了为我们的组件来添加约束。今天博客中的所有代码都是脱离storyboard的,这些代码在别的工程中也是可以使用的。...在封装聊天工具条的的时候表情键盘是之前封装好的(请参考:“iOS开发之自定义表情键盘(组件封装与自动布局)”),所以拿过来就可以用的啦。...ToolView中要用到的组件(分配内存,配置相应的属性),因为是自定义组件的封装,所以我们的storyboard就用不上啦,添加控件的代码如下: 1 //控件的初始化 2 -(void) addSubview...当然啦给控件添加约束也必须是手写代码啦,添加约束的代码如下: 1 //给控件加约束 2 -(void)addConstraint 3 { 4 //给voicebutton添加约束 5...moreButton)]; 22 [self addConstraints:moreButtonV]; 23 24 25 //给changeKeyBoardButton添加约束

2.4K80

Swift:静态工厂方法

iOS上的UIKit和Mac上的AppKit都为我们提供了创建具有原生外观的UI所需的所有基本核心构建块,但是我们经常需要自定义这些外观以适合我们的设计并为其定义布局。...尽管子类化是一项重要的语言功能,即使在面向协议的编程时代,也很容易将自定义设置与自定义行为混淆。我们并没有在上面的UILabel中真正添加任何新行为,我们只是在设置一个实例。...(暂时), //以免将此功能添加到我们的应用程序全局使用UIButton中。...private extension UIButton { static func makeForBuying() -> UIButton { let button = UIButton...在这种情况下,“自动版式”的声明性确实很方便——我们可以预先指定所有约束,而不必重写任何方法或响应任何调用。 就像用于视图一样,工厂方法为我们提供了非常干净的调用方式。

2.4K10

iOS-自定义 UIButton-文字在左、图片在右(二)

自定义 Button,设置titleEdgeInsets 和 imageEdgeInsets 属性,代码如下: UIButton *button02 = [[UIButton alloc]...make.left.equalTo(view).offset(kScreenWidth / 8 * 3.5); }]; // 如果用 Masnory 一定要调这句,不然约束有问题...自定义 Button 和 系统 Button 对比(见下图): 1.如果用系统Button,那么直接设置Button的 titleEdgeInsets和imageEdgeInsets即可(就可以不用创建自定义...Button) 2.但是每次要用到创建类似的Button的话,就要写这四句代码 3.当你的项目中有较多地方用到类似的Button的时候,建议考虑自定义,这样可能方便一些 ?...温馨提示: 1.如果使用 Masonry 框架进行自动布局的话,那么给 button 设置完约束以后一定要调用 [button02 layoutIfNeeded];不然布局显示就会有问题(见下图):

2.4K90

六天完成一个简单iOS App - 第二天

方法二:自定义button 并且重写layoutSubviews。...关于三个button添加约束的方法:可以先设置中间按钮约束,然后约束三个按钮相互之间的间距为0。左边按钮与屏幕左边间距为0,右边按钮与屏幕右边为0,高度相同。最后约束三个按钮平分屏幕宽度。...关于添加约束的方法有很多种,只要确定控件位置宽高就可以约束成功,需要细心一步一步来,即使约束失败也没有关系,删了重新约束即可,只要多试几次慢慢就会掌握。 2....登录注册拼接 如果想点击button实现动画,我们需要修改view左边线与左边屏幕的约束,获得约束属性,将View左边线与屏幕左边的距离从0修改为负一个屏幕宽度,当然也需要添加登陆View右边线和注册View...[UIView animateWithDuration:0.5 animations:^{ [self.view layoutIfNeeded]; }]; } 这里难点在于约束添加和修改自己细心修改就会成功

2.1K50

iOS自动布局——Masonry详解

,涉及了子控件和父控件,所以这条约束一定要添加到父控件中。...添加约束的规则: 如果两个控件是父子控件,则添加到父控件中。 如果两个控件不是父子控件,则添加到层级最近的共同父控件中。...效果图 我们注意到,自动布局其实工作分两步: 创建视图的约束约束添加到合适的位置 约束关系从上面的描述中,已经非常清晰了。那么如何寻找约束添加的合适位置呢? ?...如果需要,会遍历已有约束,然后逐个uninstall copy已有的约束,遍历,并逐一install remove掉所有约束,并将已添加的constraints返回。...至此,layoutConstraint就完成了全部的元素收集,可以使用添加约束的方式,只需要解决最后一个问题,约束添加到哪里呢?

91920

Swift-MVVM 简单演练(三)

首先,我们发送登录通知的时候,附带一个自定义的object(这里是字符串"bad token")过去。...这里不去做那么复杂,只是表达一下,更改导航栏标题显示样式和Button的文字图片左右对调,之前我也写过Objective-C的相关方法iOS-自定义 UIButton-文字在左、图片在右(一)、iOS-...自定义 UIButton-文字在左、图片在右(二) 将导航栏标题设置成自定义Button 这个没什么技术含量,直接上代码了。...工作原理: 当有一个运行循环启动,自动布局系统,会收集所有的约束变化 在运行循环结束前,调用layoutSubviews函数统一设置frame 如果希望某些约束提前更新!...使用layoutIfNeeded 函数让自动布局系统,提前更新当前收集到的约束变化 因此,我们手动调用一下layoutIfNeeded方法,将代码布局的约束都创建好,并显示出来,然后再进行更新约束的动画

2.5K30

iOS开发·runtime原理与实践: 方法交换篇(Method Swizzling)(iOS“黑魔法”,埋点统计,禁止UI控件连续点击,防奔溃处理)

用法 先给要替换的方法的类添加一个Category,然后在Category中的+(void)load方法中添加Method Swizzling方法,我们用来替换的方法也写在这个Category中。...方案 给按钮添加分类,并添加一个点击事件间隔的属性,执行点击事件的时候判断一下是否时间到了,如果时间不到,那么拦截点击事件。 怎么拦截点击事件呢?...*btn = [UIButton new]; btn =[[UIButton alloc]initWithFrame:CGRectMake(100,100,100,40)]; [btn...这是因为Method Swizzling对NSArray这些的类簇是不起作用的。 因为这些类簇类,其实是一种抽象工厂的设计模式。...: NSArray+CrashHandle.m @implementation NSArray (CrashHandle) // Swizzling核心代码 // 需要注意的是,好多同学反馈下面代码不起作用

2.5K60

iOS自动布局框架之Masonry

在项目中设置的AutoLayout约束,起到对视图布局的标记作用。设置好约束之后,程序运行过程中创建视图时,会根据设置好的约束计算frame,并渲染到视图上。...Masonry提供的的API有: mas_makeConstraints() 添加约束 mas_remakeConstraints() 移除之前的约束,重新添加新的约束 mas_updateConstraints...#define MAS_SHORTHAND_GLOBALS Masonry为了让代码使用和阅读更容易理解,所以直接通过点语法就可以调用,还添加了and和with两个方法。...调用此方法,如果有标记为需要重新布局的约束,则立即进行重新布局,内部会调用updateConstraints方法 - (void)updateConstraints 重写此方法,内部实现自定义布局过程...- (void)setupFrame { __weak typeof(self) weakSelf = self; //上传头像 UIButton *iconBtn = [[UIButton

1.1K60

iOS自动布局框架之Masonry

在项目中设置的AutoLayout约束,起到对视图布局的标记作用。设置好约束之后,程序运行过程中创建视图时,会根据设置好的约束计算frame,并渲染到视图上。...Masonry提供的的API有: mas_makeConstraints() 添加约束 mas_remakeConstraints() 移除之前的约束,重新添加新的约束 mas_updateConstraints...#define MAS_SHORTHAND_GLOBALS Masonry为了让代码使用和阅读更容易理解,所以直接通过点语法就可以调用,还添加了and和with两个方法。...调用此方法,如果有标记为需要重新布局的约束,则立即进行重新布局,内部会调用updateConstraints方法 - (void)updateConstraints 重写此方法,内部实现自定义布局过程...- (void)setupFrame { __weak typeof(self) weakSelf = self; //上传头像 UIButton *iconBtn = [[UIButton

2K50

iOS_自定义UITabBarController标签视图控制器

*selectedBtn; @end 然后开始写自己想要的东西了,在viewDidLoad中: (1)删除继承父类而来的tabBar,自定义自己想要的视图,其frame为原来tabBar的frame...(2)然后定义了4个按钮和4个label,即标签和标签下的标题 (3)然后循环给4个按钮添加点击事件,触发事件是同一个clickBtn - (void)viewDidLoad { [super...//删除现有的tabBar CGRect rect = self.tabBar.frame; [self.tabBar removeFromSuperview]; //添加自己的视图...UIControlEventTouchUpInside]; } } (4)然后实现按钮的点击事件clickBtn:实现按钮和其下面标题 选择和未选择状态的切换;也需要实现视图的跳转: #pragma mark -- 自定义...= sender.tag - 1; } 然后就基本实现了一个视图控制器的功能了,自己还有什么需求可以往里加,使用就跟视图的标签视图一样使用就行,只是这里的按钮图片我都是在类里就赋值好了; 这是我自定义

54430
领券