代码之家  ›  专栏  ›  技术社区  ›  Oh Danny Boy

iOS:ui按钮根据文本长度调整大小

  •  118
  • Oh Danny Boy  · 技术社区  · 14 年前

    命令 + =

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button.titleLabel setFont:[UIFont fontWithName:@"Arial-BoldMT" size:12]];
    [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
    // I need to know the width needed to accomodate NSStringVariable
    [button setTitle:NSStringVariable forState:UIControlStateNormal]; 
    // So that I can set the width property of the button before addSubview
    [button setFrame:CGRectMake(10, 0, width, fixedHeight)];
    [subNavigation addSubview:button];
    
    11 回复  |  直到 11 年前
        1
  •  3
  •   Cœur N0mi    6 年前

    在Xcode4.5及更高版本中,现在可以使用' '.

    主要优点是:

    1. 你根本不需要以编程方式设置帧!
    2. 此外,设备的更改不必麻烦您(阅读,不需要为不同的屏幕大小分别编码)。

    有几个缺点:

    1. 不向后兼容-仅适用于iOS 6及以上版本。
    2. 需要熟悉(但以后会节省时间)。

    • 我希望这两个按钮的宽度相同;或者
    • 我希望这个按钮/标签根据显示的标签调整大小!

    Here 是一个简单的教程,介绍了自动布局。

    more details .

    一开始需要一段时间,但看起来确实值得这么做。

        2
  •  129
  •   Cœur N0mi    5 年前

    在UIKit中,NSString类中添加了一些内容,以便从给定的NSString对象中获取以特定字体呈现时所需的大小。

    here . 现在是 here 不赞成。

    CGSize stringsize = [myString sizeWithFont:[UIFont systemFontOfSize:14]]; 
    //or whatever font you're using
    [button setFrame:CGRectMake(10,0,stringsize.width, stringsize.height)];
    

    …您已经将按钮的边框设置为要呈现的字符串的高度和宽度。

    您可能想在CGSize周围尝试一些缓冲区空间,但您将从正确的位置开始。

        3
  •  99
  •   Daniel Wood    12 年前

    [button sizeToFit];
    

    如果要子类化并希望添加额外的规则,则可以重写:

    - (CGSize)sizeThatFits:(CGSize)size;
    
        4
  •  32
  •   estemendoza    9 年前

    如果您的按钮是使用界面生成器创建的,并且您正在更改代码中的标题,则可以执行以下操作:

    [self.button setTitle:@"Button Title" forState:UIControlStateNormal];
    [self.button sizeToFit];
    
        5
  •  22
  •   Juan Boero    7 年前

    银行代码:

    什么时候 你能打电话给 .sizeToFit() ,它应该在设置好要显示的文本后才能读取所需的大小,如果以后更新文本,则再次调用它。

    var button = UIButton()
    button.setTitle("Length of this text determines size", forState: UIControlState.Normal)
    button.sizeToFit()
    self.view.addSubview(button)
    
        6
  •  16
  •   Fattie    6 年前

    若要使用“自动布局”完成此操作,请尝试设置可变宽度约束:

    Width Constraint

    你可能还需要调整 Content Hugging Priority Content Compression Resistance Priority 为了得到你需要的结果。


    UILabel是 :

    此UILabel仅设置为在屏幕上居中(仅限两个约束,水平/垂直):

    它完全自动改变宽度:

    任何

    enter image description here

    enter image description here

    请注意,黄色的小方格是简单的附加(“间距”为零)。当UILabel调整大小时,它们会自动移动。

    添加“>=”约束可设置UILabel的最小宽度:

    enter image description here

        7
  •  14
  •   Erik van der Neut    8 年前

    如果要调整文本的大小而不是按钮的大小,可以使用。。。

    button.titleLabel.adjustsFontSizeToFitWidth = YES;
    button.titleLabel.minimumScaleFactor = .5;
    // The .5 value means that I will let it go down to half the original font size 
    // before the texts gets truncated
    
    // note, if using anything pre ios6, you would use I think
    button.titleLabel.minimumFontSize = 8;
    
        8
  •  7
  •   Hashem Aboonajmi    5 年前

    sizeToFit无法正常工作。相反:

    myButton.size = myButton.sizeThatFits(CGSize.zero)
    

    您还可以添加 contentInset

    myButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 4, 8)

        9
  •  5
  •   Bartłomiej Semańczyk    9 年前

    简单地说:

    1. 创建 UIView
    2. 投入 UILabel 在包装纸里面。添加将标签粘贴到包装器边缘的约束。
    3. 投入 UIButton UILabel公司
    4. 享受你的自动调整按钮与文字。
        10
  •  3
  •   Dhaval Bhadania    9 年前

    我对这篇文章有一些额外的需求 sizeToFit 无法解决。我需要保持按钮居中在它的原始位置,无论文本。我也从不希望按钮比原来的尺寸大。

    因此,我将按钮设置为其最大大小,将其保存在控制器中,并在文本更改时使用以下方法来调整按钮的大小:

    + (void) sizeButtonToText:(UIButton *)button availableSize:(CGSize)availableSize padding:(UIEdgeInsets)padding {    
    
         CGRect boundsForText = button.frame;
    
        // Measures string
        CGSize stringSize = [button.titleLabel.text sizeWithFont:button.titleLabel.font];
        stringSize.width = MIN(stringSize.width + padding.left + padding.right, availableSize.width);
    
        // Center's location of button
        boundsForText.origin.x += (boundsForText.size.width - stringSize.width) / 2;
        boundsForText.size.width = stringSize.width;
        [button setFrame:boundsForText];
     }
    
        11
  •  3
  •   nator333    5 年前

    银行代码4.2

    谢天谢地,这解决了。将文本设置为按钮后,您可以从UIView中检索intrinsicContentSize,它是自然大小(官方文档是 here ). 对于UIButton,您可以像下面这样使用它。

    button.intrinsicContentSize.width
    

    为了供你参考,我调整了宽度使它看起来合适。

    button.frame = CGRect(fx: xOffset, y: 0.0, width: button.intrinsicContentSize.width + 18, height: 40)
    

    模拟器

    UIButtons with intrinsicContentSize

    https://riptutorial.com/ios/example/16418/get-uibutton-s-size-strictly-based-on-its-text-and-font

        12
  •  1
  •   Felipe Augusto P.P    6 年前

    这个按钮类具有文本的高度自动调整(对于Xamarin,但是可以为其他语言重写)

    [Register(nameof(ResizableButton))]
    public class ResizableButton : UIButton
    {
        NSLayoutConstraint _heightConstraint;
        public bool NeedsUpdateHeightConstraint { get; private set; } = true;
    
        public ResizableButton(){}
    
        public ResizableButton(UIButtonType type) : base(type){}
    
        public ResizableButton(NSCoder coder) : base(coder){}
    
        public ResizableButton(CGRect frame) : base(frame){}
    
        protected ResizableButton(NSObjectFlag t) : base(t){}
    
        protected internal ResizableButton(IntPtr handle) : base(handle){}
    
        public override void LayoutSubviews()
        {
            base.LayoutSubviews();
            UpdateHeightConstraint();
            InvalidateIntrinsicContentSize();
        }
    
        public override void SetTitle(string title, UIControlState forState)
        {
            NeedsUpdateHeightConstraint = true;
            base.SetTitle(title, forState);
        }
    
        private void UpdateHeightConstraint()
        {
            if (!NeedsUpdateHeightConstraint)
                return;
            NeedsUpdateHeightConstraint = false;
            var labelSize = TitleLabel.SizeThatFits(new CGSize(Frame.Width - TitleEdgeInsets.Left - TitleEdgeInsets.Right, float.MaxValue));
    
            var rect = new CGRect(Frame.X, Frame.Y, Frame.Width, labelSize.Height + TitleEdgeInsets.Top + TitleEdgeInsets.Bottom);
    
            if (_heightConstraint != null)
                RemoveConstraint(_heightConstraint);
    
            _heightConstraint = NSLayoutConstraint.Create(this, NSLayoutAttribute.Height, NSLayoutRelation.Equal, 1, rect.Height);
            AddConstraint(_heightConstraint);
        }
    
         public override CGSize IntrinsicContentSize
         {
             get
             {
                 var labelSize = TitleLabel.SizeThatFits(new CGSize(Frame.Width - TitleEdgeInsets.Left - TitleEdgeInsets.Right, float.MaxValue));
                 return new CGSize(Frame.Width, labelSize.Height + TitleEdgeInsets.Top + TitleEdgeInsets.Bottom);
             }
         }
    }
    
        13
  •  0
  •   Shalugin    5 年前

    下面是使用故事板的最简单的解决方案。

    1. 放置UIView并为其设置约束。例子: enter image description here
    2. 将您的UIButton放在UIView中。设置相同的约束将其附加到UIView的边缘。

    3. enter image description here

    4. 设置出口。

        @IBOutlet var button: UIButton!
        @IBOutlet var textOnTheButton: UILabel!
    
    1. 找个长的,长的,长的头衔。
    
        let someTitle = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
            textOnTheButton.text = someTitle
            button.setTitle(someTitle, for: .normal)
            button.titleLabel?.numberOfLines = 0
        }
    
    1. 运行它以确保按钮已调整大小并且可以按下。

    enter image description here

        14
  •  0
  •   MobileDev    4 年前

    不知为什么, func sizeToFit() 对我不起作用。我的设置是我在一个 UITableViewCell

    对我有用的是:

    1. 获取宽度约束
    2. 得到 intrinsicContentSize 宽度,因为根据这个 document 自动布局不知道 内部内容大小 . 将宽度约束设置为 内部内容大小 宽度

    enter image description here

    Debug View Hierachry enter image description here

    enter image description here