【问题标题】:Addtarget for UIControlStateNormal doesn't worksUIControlStateNormal 的 Addtarget 不起作用
【发布时间】:2012-12-17 20:10:15
【问题描述】:

我创建了一个名为 SectionButton 的自定义 UIButton。

该按钮有 2 个图像,一个用于正常状态,另一个用于选定和突出显示状态。

按钮也有文字,当按下按钮时,必须调整 TitleEdgesInset。

在初始化方法中我添加了方法:

[self addTarget:self action: @selector(buttonHighlighted:) forControlEvents: UIControlStateHighlighted];
[self addTarget:self action:@selector(buttonNormal:) forControlEvents:UIControlStateNormal];

但是方法 'buttonNormal:' 从未被调用,所以我无法调整 titleEdgeInsets 属性。

#import "SectionButton.h"

@implementation SectionButton

- (id)initWithFrame: (CGRect)frame andTitle: (NSString*)title andbaseImageName:(NSString*)imageBaseName
{
if (self = [super initWithFrame: frame])
{
    // Create images for button
    UIImage* normalImage = [UIImage imageNamed: imageBaseName ];
    UIImage* downImage = [UIImage imageNamed:[NSString stringWithFormat:@"%@_selected",imageBaseName]];
    // Set up button
    [self setTitle: [title uppercaseString] forState: UIControlStateNormal];    // Will be used for all states
    [self setTitleColor: [UIColor whiteColor] forState: UIControlStateNormal];
    [self.titleLabel setFont:[UIFont fontWithName:@"Helvetica" size:12.0]];

    [self setBackgroundImage: normalImage forState: UIControlStateNormal];
    [self setBackgroundImage: downImage forState: UIControlStateHighlighted];
    [self setContentEdgeInsets:UIEdgeInsetsMake(54, 0, 0, 0)];

    [self addTarget: self action: @selector(buttonHighlighted:) forControlEvents: UIControlStateHighlighted];
    [self addTarget:self action:@selector(buttonNormal:) forControlEvents:UIControlStateNormal];

}
return self;
}

- (void)buttonHighlighted: (id)sender
{
[self setTitleEdgeInsets:UIEdgeInsetsMake(0,0,-16,0)];
NSLog(@"button selected");
}

- (void) buttonNormal: (id)sender {
[self setTitleEdgeInsets:UIEdgeInsetsMake(0,0,0,0)];
NSLog(@"Button normal");
}    

}
@end

【问题讨论】:

    标签: iphone ios uibutton uicontrolevents


    【解决方案1】:

    您正在传递控制状态而不是 ControlEvent,

    [self addTarget:self action: @selector(buttonHighlighted:) forControlEvents: UIControlEventTouchDownInside];
    [self addTarget:self action:@selector(buttonNormal:) forControlEvents:UIControlEventTouchUpInside];
    

    【讨论】:

    • 是的,因为我想在按钮状态更改时启动该方法,而不是在用户点击按钮时启动,因为在这种情况下我必须向 UIControlEventTouchCancel、UIControlEventTouchDragOutside 添加更多目标...跨度>
    • 按钮状态只有在用户点击时才会改变,你还想怎么改变按钮状态
    • 我想捕捉按钮到 UIControlStateNormal 的变化。触摸按钮时,图像会发生变化,但标题暂时不会更改其 titleEdgeInsets,这会破坏“按下”的效果。
    • 当用户触摸 btn UIControlEventTouchDownInside 被调用,当它释放它时 UIControlEvenTouchUpInside 被调用,现在你必须在这些方法中进行自定义,我猜
    • 否,因为您必须考虑其他事件,例如:UIControlEventTouchDragOutside。但是这些事件都不会与 UIControlStateNormal 的图像更改同时发生,并且 UIControlStateNormal 事件永远不会被触发。
    【解决方案2】:

    您只需调用该按钮的 1 个方法。

    在该方法中,您需要根据按钮的当前状态执行代码。

    【讨论】:

    • 这不起作用,因为按钮在调用 'buttonNormal:' 后恢复了 'Normal' 状态。所以我在 titleEdgeInsets 中有没有任何调整的文本。
    • 然后调用 buttonNormal: 方法后,将状态更改为突出显示或任何其他您想要实现的状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多