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

Iphone 更改UISearchBar中取消按钮的框架,iphone,frame,uisearchbar,Iphone,Frame,Uisearchbar,我有以下代码来更改应用程序中UISearchBar的外观,如下图所示: for(int i = 0; i < [[searchBar subviews] count]; i++){ UIView *subView = [[searchBar subviews] objectAtIndex:i]; if([[NSString stringWithFormat:@"%@", [subView class]] isEqualToString:@"UINavigationButto

我有以下代码来更改应用程序中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];
    }
}
for(int i=0;i<[[searchBar子视图]计数];i++){
UIView*子视图=[[searchBar子视图]对象索引:i];
如果([[NSString stringWithFormat:@“%@,[subView类]]IseQualtString:@“UINavigationButton”]){
UIButton*cancelButton=(UIButton*)子视图;
CGRect buttonFrame=cancelButton.frame;
buttonFrame.size.height=52;
[取消按钮设置框:按钮框];
[取消按钮设置标题:@“取消”状态:uicontrol状态正常];
[cancelButton setBackgroundImage:[UIImage ImageName:@“cancel.png”]用于状态:UIControlStateNormal];
[cancelButton setBackgroundImage:[UIImage ImageName:@“cancel_pressed.png”]用于状态:UIControlStateHighlighted];
}
}
如您所见,我试图更改UISearchBar中包含的按钮的高度,但运气不佳。我确实得到了对按钮的引用,因为我可以更改文本和背景图像,而不是更改帧的高度。我只希望按钮的高度与52px处的搜索框相同

编辑:


我已经找到了一个非常粗糙的解决方案,但是添加一个UIButton作为Cancel按钮的子视图并不十分优雅。它确实起作用,但正如我所说,它不是很好

所以我用这个覆盖了
-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;
    }
}

实际上,您可以使用下面的方法访问“取消”按钮:

UIBarButtonItem *cancelButton = [UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil];

buttontype是自定义的吗?不是,它是UISearchBar子视图中的标准UIButton。仅为每个ControlState设置背景。可能子类uisearchbar和override-addSubView方法并在那里设置帧?在
-addSubView
中更改帧没有效果。我猜苹果的
-layoutSubViews
中有一个硬编码按钮大小的东西。您可以覆盖
-layoutSubViews
,但这会导致一点脏动画有一种更复杂的方法来解决动画中的问题。如果你需要,请告诉我