UISearchBar 的取消按鈕是內部 UIButton,遍歷 subviews 找到類型為 UIButton 的視圖設置背景圖片。
for (UIView *subview in searchBar.subviews) {
if ([subview isKindOfClass:[UIButton class]]) {
UIButton *cancelButton = (UIButton *)subview;
cancelButton.enabled = YES;
[cancelButton setBackgroundImage:[UIImage imageNamed:@"yourImageName"] forState:UIControlStateNormal];
break; // 找到即退出
}
}
searchBar 佈局完成後調用(如 viewDidLayoutSubviews 或搜索框成為第一響應者後)。- (void)customizeCancelButton:(UIView *)view {
for (UIView *sub in view.subviews) {
if ([sub isKindOfClass:[UIButton class]]) {
UIButton *btn = (UIButton *)sub;
[btn setBackgroundImage:[UIImage imageNamed:@"cancel_bg"] forState:UIControlStateNormal];
} else {
[self customizeCancelButton:sub]; // 遞歸
}
}
}
[[UIButton appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]]
setBackgroundImage:[UIImage imageNamed:@"cancel_bg"] forState:UIControlStateNormal];
遍歷視圖樹定制原生控件細節,UIAppearance 更優雅全局生效。