更改 UIButton 框架会断开它与 IBAction 选择器的连接
Changing UIButton frame disconnects it from IBAction selector
我有一个包含 UIButton
的 xib 文件。我控制 + 拖动按钮来创建一个动作。按钮的位置必须动态设置。下面的方法是从更新按钮位置的 drawRect:
方法调用的。
-(void)updateButtonPosition {
CGFloat xPos = self.label.frame.origin.x + self.label.frame.size.width;
CGFloat yPos = self.label.frame.origin.y + self.label.frame.size.height - 25;
CGRect frame = CGRectMake(xPos, yPos, self.button.frame.size.width, self.button.frame.size.height);
self.button.frame = frame;
}
但我注意到调用此函数会使 UIButton
与我通过控制 + 拖动创建的操作断开连接(即,当应用程序处于 运行 时单击按钮时没有任何反应)。我评论了调用此函数的部分。现在按钮开始工作并且调用了操作方法。因此,更改框架 断开 UIButton 与其操作方法的连接。
编辑:已为其所有超级视图启用用户交互。我没有使用自动布局。项目就是这样。
如何更改按钮的框架,以便在单击按钮时也调用该操作?
检查按钮的框架及其超级视图框架。只有当按钮驻留在其超级视图框架内时,该按钮才会接收触摸事件。
无法重现您的问题,我拖了一个名为 "btnAction" 的动作和一个名为 "btnTest" 的出口。
这是ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
- (IBAction)btnAction:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *btnTest;
@end
这是ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
// [super viewDidLoad];
// // Do any additional setup after loading the view, typically from a nib.
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(grHandler)]];
}
-(void)grHandler{
NSLog(@"grHandler actived.");
[self updateButtonPosition];
}
- (IBAction)btnAction:(id)sender {
NSLog(@"btn actived.");
}
-(void)updateButtonPosition {
CGFloat xPos = 20;
CGFloat yPos = 30;
CGRect frame = CGRectMake(xPos, yPos, self.btnTest.frame.size.width, self.btnTest.frame.size.height);
self.btnTest.frame = frame;
}
@end
试试用我的代码,告诉我问题出在哪里?
那我可以帮你
我的按钮的框架在其父视图的框架之外。因此它无法点击。
有关详细信息,请参阅 UIButton not responding after set frame within UIScrollview
我有一个包含 UIButton
的 xib 文件。我控制 + 拖动按钮来创建一个动作。按钮的位置必须动态设置。下面的方法是从更新按钮位置的 drawRect:
方法调用的。
-(void)updateButtonPosition {
CGFloat xPos = self.label.frame.origin.x + self.label.frame.size.width;
CGFloat yPos = self.label.frame.origin.y + self.label.frame.size.height - 25;
CGRect frame = CGRectMake(xPos, yPos, self.button.frame.size.width, self.button.frame.size.height);
self.button.frame = frame;
}
但我注意到调用此函数会使 UIButton
与我通过控制 + 拖动创建的操作断开连接(即,当应用程序处于 运行 时单击按钮时没有任何反应)。我评论了调用此函数的部分。现在按钮开始工作并且调用了操作方法。因此,更改框架 断开 UIButton 与其操作方法的连接。
编辑:已为其所有超级视图启用用户交互。我没有使用自动布局。项目就是这样。
如何更改按钮的框架,以便在单击按钮时也调用该操作?
检查按钮的框架及其超级视图框架。只有当按钮驻留在其超级视图框架内时,该按钮才会接收触摸事件。
无法重现您的问题,我拖了一个名为 "btnAction" 的动作和一个名为 "btnTest" 的出口。
这是ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
- (IBAction)btnAction:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *btnTest;
@end
这是ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
// [super viewDidLoad];
// // Do any additional setup after loading the view, typically from a nib.
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(grHandler)]];
}
-(void)grHandler{
NSLog(@"grHandler actived.");
[self updateButtonPosition];
}
- (IBAction)btnAction:(id)sender {
NSLog(@"btn actived.");
}
-(void)updateButtonPosition {
CGFloat xPos = 20;
CGFloat yPos = 30;
CGRect frame = CGRectMake(xPos, yPos, self.btnTest.frame.size.width, self.btnTest.frame.size.height);
self.btnTest.frame = frame;
}
@end
试试用我的代码,告诉我问题出在哪里?
那我可以帮你
我的按钮的框架在其父视图的框架之外。因此它无法点击。
有关详细信息,请参阅 UIButton not responding after set frame within UIScrollview