您的当前位置:首页UIButton 如何变相获取 titleLabel.frame

UIButton 如何变相获取 titleLabel.frame

2024-12-12 来源:哗拓教育

Keywords: UIButton, titleLabel, imageView, frame, bounds, size, width

因此,iOSers 发明了许多诡异的获取 size 的方法。比如提前[self setNeedsLayout]; [self layoutIfNeeded];,或者提前调用一下 titleLabel / imageView 的属性,或者将获取 size 放入 dispatch_async(dispatch_get_main_queue()...中。这些我统统试过,然而都不好用。

那怎么获取呢?答案是:[titleLable.text sizeWithAttributes: userAttributes].width

PS: 已经加载按钮后,要根据文字变化,动态改变按钮的 frame 要重新加载按钮……很麻烦。


篇二:控件如何绑定类方法?

keywords: class method, UIButton, 按钮, addTarget, action

[xxxTextField addTarget:[SomeClass class]
                      action:@selector(method)
            forControlEvents:UIControlEventXxx];

篇三:如何在 UITextField 的委托方法中重设一个复杂的占位符(placeholder)

按:需求合理而实现诡异的情况总是层出不穷……

Q1: 什么样的合理需求?
A1: 用户点击输入框,占位符消失。若 TA 离开时没有输入任何文本,则占位符得重新变回来。

Q2: 什么叫复杂的占位符?
A2: 包括但不限于:与「输入时」(Editing Time?) 不同的对齐方式,由 NSAttributedString 创建,同时根据不同机型还做了字号缩放之类的适配……

栗子(兼解决方案):

- (void)setMonthTextFieldPlaceholder:(UITextField *)tf {
  
  if ((is4S || is5S) && (isEN || isTh)) {// Thailand
    tf.textAlignment = NSTextAlignmentCenter;
    tf.attributedPlaceholder =
    [[NSAttributedString alloc] initWithString:NSLocalizedString(@"card_month", nil)
                                    attributes:@{
                                                 NSFontAttributeName : [UIFont systemFontOfSize:contentFontSize - 1]
                                                 }
     ];
  } else {
      tf.placeholder = NSLocalizedString(@"card_month", nil);
      tf.textAlignment = NSTextAlignmentRight;
    }

解释:在 View 中创建 textField 时,就把设置占位符的部分单独用一个函数来写。(由于指针的关系,对形参的操作可直接影响实参~)再把这个设置方法暴露在头文件里。

使用:比如在委托方法- (void)textFieldDidEndEditing:(UITextField *)textField 你就可以通过:

if (!textField.text.length) {
  [someView setMonthTextFieldPlaceholder:textField];
}

来轻松重设一个「复杂的」占位符了~


PS: 实际的需求其实更麻烦,某些语言占位符要居右,而开始输入时要居中。然而只要占位符在,那么光标要么居左要么居右,设置居中是不行的,所以要提前把 palceholder = nil。
如果之后用户没输入,再调用 setPlaceholder 方法……

PS2: shouldChangeCharactersInRange:(NSRange)range 是有坑的,原理我也不清楚。具体情况是:从空 textField 输入时的 range.location 与 编辑一个已有内容的 textField(比如从父界面传回了一些数据)时的 range.location 差了一位(内容统一长度的话)。有的 location 起始是这样的:nil, 2, 3,有的是 nil, 1, 2...

显示全文