簡體   English   中英

更改 UISearchBar 中取消按鈕的框架

[英]Change frame of cancel button in UISearchBar

我有以下代碼來更改應用程序中 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 的搜索框相同。

在此處輸入圖片說明

編輯:

我找到了一個非常笨拙的解決方案,但是將 UIButton 添加為取消按鈕的子視圖並不是很優雅。 它可以完成這項工作,但正如我所說,它不是很好。

其實你可以使用下面的方法來訪問取消按鈕:

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

所以我用這個覆蓋了-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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM