天道酬勤,学无止境

Swift - 动态改变 UIButton 的大小(Swift - dynamically change size of UIButton)

问题

我正在尝试动态更改 UIButton 的框架,但它不起作用。

@IBOutlet weak var button1: UIButton!

@IBAction func btn_move2_touchupinside(sender: AnyObject, forEvent event: UIEvent) {
           button1.frame = CGRectMake(0, 0, 100, 100)
}

我猜我应该在更改帧后重新加载按钮。 有人可以帮忙吗?

回答1

自动布局阻止您更新按钮的框架。 这里有 3 种不同的方法,您可以使这项工作从最简单到最难设置:

  1. 关闭自动布局。 在 Interface Builder 中,单击您的视图控制器。 然后在最右侧的文件检查器中,取消选中Use Auto Layout

  2. ViewDidLoad编程方式定义您的按钮:

     let button = UIButton.buttonWithType(.System) as UIButton button.frame = CGRectMake(200, 200, 100, 100) button.addTarget(self, action: "btn_move2_touchupinside:forEvent:", forControlEvents: .TouchUpInside) button.setTitle("New Button", forState: .Normal) self.view.addSubview(button)
  3. 为您的按钮设置 4 个约束(从超级视图前导边距的水平偏移、从顶部布局指南的垂直偏移、宽度和高度)。 为这些约束设置@IBOutlets ,然后在代码中更新它们的constant属性。

回答2

只需使用此代码即可正常工作:

button.layer.frame = newFrame

或者您需要重置按钮的中心:

button.frame = newFrame
button.center = newCenter
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Swift-如何在按钮上显示图像?(Swift- How to Display Image over Button?)
    问题 我正在尝试在按钮上显示图像,我正在按钮上显示图像的蓝色打印,到目前为止我已经尝试过 - override func viewDidLoad() { super.viewDidLoad() var birdTexture1 = UIImage(named: "fish.png") as UIImage button1.frame = CGRectMake(100, 10, 50, 150) button1.setImage(birdTexture1, forState: .Normal) button1.setTitle("Testing", forState: UIControlState.Normal) button1.addTarget(self, action: "btnAction:", forControlEvents: UIControlEvents.TouchUpInside) self.view.addSubview(button1) // Do any additional setup after loading the view, typically from a nib. } 通过上面的代码,我得到了以下输出 但实际图像是这样的—— 回答1 我认为你的 UIButton 需要是 UIButtonTypeCustom 类型,而不是
  • 在 Swift 3/iOS10 中使用带有自定义字体的动态类型的更好方法(A better way to use Dynamic Type with a custom font in Swift 3/iOS10)
    问题 我尝试了两种方法: 方法一: label.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.body) label.adjustsFontForContentSizeCategory = true 这很好用,即使在“设置”中更改了首选文本大小,文本大小也会自动更改,甚至在我返回应用程序之前也是如此。 但它只适用于系统字体(旧金山)。 方法二: 要使用自定义字体,我向UIFontDescriptor添加了一个扩展: //from this answer http://stackoverflow.com/a/35467158/2907715 extension UIFontDescriptor { private struct SubStruct { static var preferredFontName: String = "Avenir-medium" } static let fontSizeTable : NSDictionary = [ UIFontTextStyle.headline: [ UIContentSizeCategory.accessibilityExtraExtraExtraLarge: 23, UIContentSizeCategory
  • 多行UIButton和自动布局(Multiline UIButton and autolayout)
    问题 我创建了一个如下所示的视图控制器: 我希望两个顶部按钮之间以及它们与整个视图的左/右边缘之间始终保持20个点。 它们也应该始终具有相同的宽度。 我已经为所有这些创建了约束,并且它完全按照我想要的方式工作。 问题是纵向约束。 按钮应始终位于顶部边缘下方20个点。 它们应该具有相同的高度。 但是,自动版式不尊重左侧标签需要两行才能适合其所有文本,因此结果如下所示: 我希望它看起来像第一张照片。 我无法在按钮上添加固定的高度限制,因为当应用程序在iPad上运行时,只需要一行,那么那会浪费额外的空间。 在viewDidLoad我尝试了以下操作: - (void)viewDidLoad { [super viewDidLoad]; self.leftButton.titleLabel.preferredMaxLayoutWidth = (self.view.frame.size.width - 20.0 * 3) / 2.0; self.rightButton.titleLabel.preferredMaxLayoutWidth = (self.view.frame.size.width - 20.0 * 3) / 2.0; } 但这根本没有改变。 问题:如何使自动布局尊重左按钮需要两行? 回答1 我有一个同样的问题,我希望按钮随其标题一起增长。
  • 动态更改UILabel的字体大小(Dynamically changing font size of UILabel)
    问题 我目前有一个UILabel : factLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 280, 100)]; factLabel.text = @"some text some text some text some text"; factLabel.backgroundColor = [UIColor clearColor]; factLabel.lineBreakMode = UILineBreakModeWordWrap; factLabel.numberOfLines = 10; [self.view addSubview:factLabel]; 在我的iOS应用程序的整个生命周期中, factLabel获得了许多不同的值。 有些包含多个句子,有些则只有5或6个单词。 如何设置UILabel以便更改字体大小,以使文本始终适合我定义的边界? 回答1 单线: factLabel.numberOfLines = 1; factLabel.minimumFontSize = 8; factLabel.adjustsFontSizeToFitWidth = YES; 上面的代码会将文本的字体大小减小到(例如) 8以使文本适合标签内的大小。 numberOfLines = 1是强制性的。 多行:
  • 如何动态设置UIScrollView的内容大小(How to set content size of UIScrollView dynamically)
    问题 我有关于UIScrollview问题。 故事是我有一个名为ChartsView的UIView ,我自己通过重写方法drawRect()重绘了它。 工程图的内容是动态生成的。 所以直到运行时我才知道它的大小。 问题是我如何/在哪里可以动态设置其超级视图(scrollView)的内容大小?对此有任何想法吗? - (void)viewDidLoad { [super viewDidLoad]; // not this way. it's fixed size..... ChartsView *chartsView = [[ChartsView alloc]initWithFrame:CGRectMake(0, 0, 320, 800)]; self.scrollView.contentSize = chartsView.frame.size; [self.scrollView addSubview:chartsView]; } 回答1 一种更简单的方法 - (void)viewDidLoad { float sizeOfContent = 0; UIView *lLast = [scrollView.subviews lastObject]; NSInteger wd = lLast.frame.origin.y; NSInteger ht = lLast.frame.size
  • UIButton:使点击区域大于默认点击区域(UIButton: Making the hit area larger than the default hit area)
    问题 我有一个关于UIButton及其命中区域的问题。 我在界面构建器中使用“信息暗”按钮,但是发现命中区域不足以容纳某些人的手指。 有没有一种方法可以通过编程方式或在Interface Builder中增加按钮的点击区域,而无需更改InfoButton图形的大小? 回答1 由于我使用的是背景图片,因此这些解决方案都无法很好地满足我的需求。 这是一个执行一些有趣的Objective-C魔术的解决方案,并以最少的代码提供了一个解决方案。 首先,向UIButton添加一个类别,该类别将覆盖点击测试,还添加一个用于扩展点击测试框架的属性。 UIButton + Extensions.h @interface UIButton (Extensions) @property(nonatomic, assign) UIEdgeInsets hitTestEdgeInsets; @end UIButton + Extensions.m #import "UIButton+Extensions.h" #import <objc/runtime.h> @implementation UIButton (Extensions) @dynamic hitTestEdgeInsets; static const NSString *KEY_HIT_TEST_EDGE_INSETS = @
  • 如何不在UIButton中拉伸图像(How to not stretch an image in UIButton)
    问题 我正在尝试以编程方式创建自定义UITableViewCell,并且该单元格的子视图之一将是其中包含图像(放大镜的简单图像)的按钮。 但是,我希望按钮的图像居中并按比例缩小以适合按钮,而不要拉伸以填充整个按钮。 下面是我的代码,其中self指向将按钮放入其中的自定义UITableViewCell。 self.myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [self.myButton setBackgroundImage:[UIImage imageNamed: @image_name_here"] forState:UIControlStateNormal]; self.myButton.frame = CGRectMake(...//something, something) self.myButton.imageView.contentMode = UIViewContentModeCenter; [self.contentView addSubview:self.mySearchHelpButton]; 现在,图像会拉伸以填充整个按钮,而不是按比例缩放,因此非常合适。
  • 使用 Swift 以编程方式将文本标签和按钮添加到动态 tableview 单元格(Add Text Label and Button to dynamic tableview cell programmatically with Swift)
    问题 我有一个动态 tableview 和一个显示数组的原型单元格。 我的问题是如何在单元格左侧添加一个在每个单元格上显示不同名称的按钮,然后在右侧添加一个标签以显示数组信息。 谢谢! :D 所以想象这是下面的单元格: 左侧:按钮(数组信息)<-------------------> 右侧:TextLabel(数组信息) 回答1 你可以这样实现 let titleArray = ["a", "b", "c"] func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return 50 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { //return no.of cell do you want } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cellHeight = tableView(self.tableView
  • Swift:使用故事板在 Tableview 上浮动加号按钮(Swift: Floating Plus button over Tableview using The StoryBoard)
    问题 如何使用故事板将浮动按钮添加为 Facebook 的应用程序室? 我不能在 tableview 上拖动 UIView,这是我知道的唯一方法。 回答1 此按钮代码如下: 添加阴影使按钮变圆添加动画以引起注意 Swift 4.2:完整的视图控制器实现 import Foundation public class FloatingButtonViewController: UIViewController { private var floatingButton: UIButton? // TODO: Replace image name with your own image: private let floatingButtonImageName = "NAME OF YOUR IMAGE" private static let buttonHeight: CGFloat = 75.0 private static let buttonWidth: CGFloat = 75.0 private let roundValue = FloatingButtonViewController.buttonHeight/2 private let trailingValue: CGFloat = 15.0 private let leadingValue: CGFloat = 15.0
  • UIButton:如何使用imageEdgeInsets和titleEdgeInsets将图像和文本居中?(UIButton: how to center an image and a text using imageEdgeInsets and titleEdgeInsets?)
    问题 如果我只在按钮中放置一个图像,然后将imageEdgeInsets设置为更靠近顶部,则图像将居中,并且所有功能均会按预期进行: [button setImage:image forState:UIControlStateNormal]; [button setImageEdgeInsets:UIEdgeInsetsMake(-15.0, 0.0, 0.0, 0.0)]; 如果我仅在按钮中放置文本,并将titleEdgeInsets设置为更靠近底部,则文本将保持居中状态,并且可以按预期运行: [button setTitle:title forState:UIControlStateNormal]; [button setTitleEdgeInsets:UIEdgeInsetsMake(0.0, 0.0, -30, 0.0)]; 但是,如果我将4行放在一起,则文本会干扰图像,并且都失去中心对齐。 我所有的图像都具有30像素的宽度,如果我在setSettletleEdgeInsets的UIEdgeInsetMake的左侧参数中放置了30个像素,则文本将再次居中。 问题在于图像永远不会居中,因为它似乎取决于button.titleLabel的大小。 我已经尝试过使用按钮大小,图像大小,titleLabel大小进行许多计算,并且永远都无法完美地居中。 有人已经遇到了同样的问题吗?
  • UIView 迅速改变其位置(UIView changing its position in swift)
    问题 如何使UIView从其原始位置轻触按钮向上滑动,然后轻触按钮将其放回原处? 使用 Swift 和 Xcode 6。 我目前已经尝试过这个: @IBOutlet weak var DynView: UIView! @IBAction func btnUp(sender: AnyObject) { } 回答1 您必须实现一个动画,在单击时更改DynView位置。 下面是一个例子: @IBAction func btnUp(sender: AnyObject) { let xPosition = DynView.frame.origin.x let yPosition = DynView.frame.origin.y - 20 // Slide Up - 20px let width = DynView.frame.size.width let height = DynView.frame.size.height UIView.animateWithDuration(1.0, animations: { dynView.frame = CGRect(x: xPosition, y: yPosition, width: width, height: height) }) } 回答2 嗨,如果你愿意,可以创建这个扩展。 对于斯威夫特 创建 File Extends
  • 使用大小类以编程方式实现两种不同的布局(Programmatically implementing two different layouts using size classes)
    问题 我有一个四按钮布局。 在肖像中,它们应该一个在另一个之上。 在横向中,它们应该在两列中,每列有两个按钮。 我在代码中实现按钮 - 非常简单的东西: UIButton *btn1 = [[UIButton alloc] init]; [self.view addSubview: btn1]; UIButton *btn2 = [[UIButton alloc] init]; [self.view addSubview: btn2]; UIButton *btn3 = [[UIButton alloc] init]; [self.view addSubview: btn3]; UIButton *btn4 = [[UIButton alloc] init]; [self.view addSubview: btn4]; NSDictionary *views = NSDictionaryOfVariableBindings(btn1, btn2, btn3, btn4); [btn1 setTranslatesAutoresizingMaskIntoConstraints:NO]; [btn2 setTranslatesAutoresizingMaskIntoConstraints:NO]; [btn3
  • 如何将AnyClass转换为特定的类并在Swift中动态初始化它?(How to convert AnyClass to a specific Class and init it dynamically in Swift?)
    问题 在Object-C中,我将Class对象存储在数组中,并像这样动态地初始化它们: self.controllers=@[[OneViewController class],[TwoViewController class]]; Class clz = self.controllers[index]; UIViewController *detailViewController = [[clz alloc] init]; 在Swift中,我尝试这种方式,但会引发错误: var controllers:AnyClass[] = [OneViewController.self,TwoViewController.self] var clz : AnyClass = controllers[index] var instance = clz() // Error:'AnyObject' is not constructible with () 我想知道是否有一种方法可以将AnyClass转换为特定的Class? 还是其他好主意? 回答1 您可以将数组指定为公共超类的类型,然后使用类型推导执行正确的操作(Beta-3语法): let classArray: [UIViewController.Type] = [ OneViewController.self
  • UICollectionView自动调整大小的单元格(UICollectionView Self Sizing Cells with Auto Layout)
    问题 我正在尝试使用Auto Layout来自动调整UICollectionViewCells大小,但是我似乎无法使这些单元格自行调整大小以适应内容。 我无法理解如何从单元的contentView内部内容更新单元的大小。 这是我尝试过的设置: 在contentView中带有UITextView自定义UICollectionViewCell 。 UITextView滚动被禁用。 contentView的水平约束为:“ H:| [_textView(320)]”,即, UITextView固定在单元格的左侧,显式宽度为320。 contentView的垂直约束为:“ V:| -0-[_ textView]”,即, UITextView固定在单元格的顶部。 UITextView的高度约束设置为一个常量, UITextView报告将适合该常量。 单元格背景设置为红色, UITextView背景设置为蓝色的外观如下: 我将我一直在玩的项目放在GitHub上。 回答1 已为Swift 5更新 preferredLayoutAttributesFittingAttributes重命名为preferredLayoutAttributesFitting并使用自动调整大小 已为Swift 4更新
  • 如何从 iOS 设置检测动态字体大小的变化?(How to detect Dynamic Font size changes from iOS Settings?)
    问题 在设置-> 常规-> 文字大小中,更改文字大小后,我必须退出我自己的应用程序才能将大小应用于 [UIFont preferredFontForTextStyle:..] 是否有委托或通知通知我的应用程序重新应用新尺寸? 更新:我尝试了以下但有趣的是,字体大小将在我 BG 并启动应用程序 TWICE 后应用。 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fromBg:) name:UIApplicationDidBecomeActiveNotification object:nil]; } -(void) fromBg:(NSNotification *)noti{ self.headline1.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; self.subHeadline.font = [UIFont preferredFontForTextStyle
  • 如何设置自适应多行UILabel文本?(How do I set adaptive multiline UILabel text?)
    问题 我的故事板笔尖中有一个名为titleLabel的UILabel ,设置为默认高度。 我希望它以编程方式扩展高度以适合其内容。 到目前为止,这是我尝试过的: // just setting content titleLabel.text = "You don't always know what you are getting with mass-market cloud computing services. But with SimpliCompute, the picture is clear. SimpliCompute gives you powerful virtual servers you can deploy using just your web browser. That’s enterprise grade technology you can deploy and control on-the-fly." titleLabel.numberOfLines = 0 titleLabel.preferredMaxLayoutWidth = 700 titleLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping titleLabel.sizeToFit() 这一切对我都不起作用!
  • 在 UITableViewController (Swift) 顶部添加按钮(Add button on top of UITableViewController (Swift))
    问题 我正在尝试在 uitableview 控制器表视图的顶部添加一个按钮。 视图控制器有一个导航控制器和静态单元格,这就是为什么它是 uitableviewcontroller 而不是 uiviewcontroller 的原因。 现在我正在尝试在屏幕底部添加一个按钮,该按钮连接到导航控制器,以便它不会随表视图一起滚动。 我正在尝试制作类似于下面的内容。 它有一个顶部栏的导航控制器,一个带有静态单元格的表格视图,然后是一个按钮,但他们是如何制作按钮的? 图片:http://postimg.org/image/ilsmqqrip/ 谢谢! 更新:如何使用 Swift 将 uiviewcontroller 与带有静态单元格的 tableview 一起使用? 回答1 我发现容器视图在这种情况下非常有用! 一个干净的解决方案,非常容易实施。 只需创建一个普通的 UIViewController,添加你的按钮和一个 ContainerView 作为这个 UIViewController 的子视图(下图中的中间部分)。 最后从 ContainerView 创建 Embed Segue 到你的 UITableViewController (右边的那个)。 这样您就可以使用静态单元格原型,而不仅限于同时使用 UITableView。 结果: 回答2 对此有更好的解决方案。 您可以通过禁用相应
  • 如何在 Swift 中以编程方式为 UILabel 提供动态高度?(How to give dynamic height to UILabel programmatically in Swift?)
    问题 我采用了使用 for 循环动态生成的 UIlabel,在标签中分配了每种类型的差异文本,我想根据文本动态地赋予 UILabel 大小。 有什么简单的解决方案可以在 Swift 中做到这一点吗? 回答1 let label:UILabel = UILabel(frame: CGRectMake(x, y, width, height)) label.numberOfLines = 4 label.lineBreakMode = NSLineBreakMode.ByWordWrapping let font = UIFont(name: "Helvetica", size: 20.0) label.font = font label.text = "Whatever you want the text enter here" label.sizeToFit() 如果你想根据文本的内容设置numberOfLines,给出你的最大行数。这在这里很重要。 回答2 根据您分配给它的文本、字体和宽度获取标签高度: func rectForText(text: String, font: UIFont, maxSize: CGSize) -> CGSize { let attrString = NSAttributedString.init(string: text, attributes
  • 以编程方式向视图添加多个按钮,调用相同的方法,确定其为哪个按钮(Add a multiple buttons to a view programmatically, call the same method, determine which button it was)
    问题 我想以编程方式向视图添加多个UIButton-在编译时,按钮的数量未知。 我可以使一个或多个UIButton像这样(循环执行,但为简单起见简称): UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchDown]; [button setTitle:@"Button x" forState:UIControlStateNormal]; button.frame = CGRectMake(100.0, 100.0, 120.0, 50.0); [view addSubview:button]; 从此链接复制/编辑:如何以编程方式创建基本的UIButton? 但是,如何确定buttonClicked:单击了哪个按钮? 如果可能的话,我想传递标签数据以识别按钮。 回答1 您可以在重要的地方(例如数组)保留对实际按钮对象的引用,也可以将按钮的标签设置为有用的东西(例如其他数据数组中的偏移量)。 例如(使用标签,因为这通常必须有用): for( int i = 0; i < 5; i++ ) { UIButton*
  • UIWebView动态内容大小(UIWebView dynamic content size)
    问题 我一直在环顾四周,无法看到任何快速相关的方法来执行此操作。 我试图让我的UIWebViews高度是动态的。 我有一个UIWebView,它使用loadHtmlString函数加载数据。事实是,每次我加载具有不同长度的不同字符串时,我都从sqlite数据库加载数据,并且Web视图自然会获得不同的高度。 现在,我需要知道如何将UIWebView设置为正确的高度,以便将我的下一个内容加载到webView的正下方。 这就是我到目前为止 var jobSkillView = UIWebView(frame: CGRectMake(-5, 480.0, screenWidth, 300.0)) jobSkillView.loadHTMLString("<html><body p style='font-family:arial;font-size:16px;'>" + jobSkills + "</body></html>", baseURL: nil) jobSkillView.stringByEvaluatingJavaScriptFromString("document.body.innerHTML") jobSkillView.scrollView.scrollEnabled = true jobSkillView.scrollView.bounces = true