在 UISearchBar 中更改取消按钮的框架

5

我有以下代码来改变我的应用程序中UISearchBar的外观,如下图所示:

for(int i = 0; i < [[searchBar subviews] count]; i++){
    UIView *subView = [[searchBar subviews] objectAtIndex:i];
    if([[NSString stringWithFormat:@"%@", [subView class]] isEqualToString:@"UINavigationButton"]){
        UIButton *cancelButton = (UIButton *)subView;

        CGRect buttonFrame = cancelButton.frame;
        buttonFrame.size.height = 52;
        [cancelButton setFrame:buttonFrame];

        [cancelButton setTitle:@"Cancel" forState:UIControlStateNormal];
        [cancelButton setBackgroundImage:[UIImage imageNamed:@"cancel.png"] forState:UIControlStateNormal];
        [cancelButton setBackgroundImage:[UIImage imageNamed:@"cancel_pressed.png"] forState:UIControlStateHighlighted];
    }
}

你可以看到,我试图更改UISearchBar中包含的按钮的高度,但没有成功。我可以获得对该按钮的引用,因为我可以更改文本,并更改背景图像,但框架的高度不变。我希望按钮的高度与搜索框相同,为52px。
编辑:我已经找到了一个非常hacky的解决方案,但它并不是很优雅,就是添加一个UIButton作为取消按钮的子视图。它能完成任务,但我说它不够好看。

按钮类型是自定义的吗? - Eric
不,它是 UISearchBar 的子视图中的标准 UIButton,只是为每个控制状态设置了背景。 - SamRowley
也许可以子类化 UISearchBar 并重写 -addSubview 方法,在那里设置它的 frame? - blub
-addSubView中更改框架没有效果。我猜测是因为Apple的-layoutSubViews中有一些硬编码的按钮大小。你可以覆盖-layoutSubViews,但会导致动画效果不太好。 - Zayin Krige
2个回答

4
实际上,您可以使用以下方法访问取消按钮:
UIBarButtonItem *cancelButton = [UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil];

0

所以我用这个覆盖了-layoutSubViews,但是我有两个问题

我讨厌遍历视图来找到匹配的视图,而且它会稍微破坏一下动画效果

- (UIButton *)cancelButton {
    for (UIView *v in self.subviews) {
        if ([v isKindOfClass:[UIButton class]]) {
            NSString *caption = [[((UIButton *)v) titleLabel] text];
            if ([caption isEqualToString:@"Cancel"] )
                return (UIButton *)v;
        }
    }
    return nil;
}

- (BOOL)cancelButtonIsShowing {
    return ([self cancelButton] != nil);
}

- (void)layoutSubviews {
    [super layoutSubviews];
    if ([self cancelButtonIsShowing]) {
        UIButton *cancelButton = [self cancelButton];

        UIImage *i = [UIImage imageNamed:@"Cancel_BTN"];
        CGRect f = CGRectMake(267, 5, i.size.width, i.size.height);
        cancelButton.frame = f;
    }
}

有一种更为复杂的方法来解决动画中的故障。如果您需要,请告诉我。 - Zayin Krige

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接