отвечая на старый вопрос здесь, но я недавно сам боролся с этим и обнаружил некоторые недостатки с другими ответами для ситуации, к которой я пытался обратиться.вот что я сделал в подклассе UISearchBar:
сначала добавьте свойство UIButton (здесь «selectButton»).затем переопределите метод initWithFrame и выполните что-то похожее на следующее:
-(id)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame])
{
self.selectButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
self.selectButton.contentEdgeInsets = (UIEdgeInsets){.left=4,.right=4};
[self.selectButton addTarget:self action:@selector(pressedButton:) forControlEvents:UIControlEventTouchUpInside];
self.selectButton.titleLabel.numberOfLines = 1;
self.selectButton.titleLabel.adjustsFontSizeToFitWidth = YES;
self.selectButton.titleLabel.lineBreakMode = UILineBreakModeClip;
[self addSubview:self.selectButton];
[self.selectButton setFrame:CGRectMake(5, 6, 60, 31)];
}
return self;
}
Теперь вы хотите переопределить метод subviews макета, чтобы изменить размер панели поиска до соответствующей ширины, в зависимости от того, отображается ли кнопка отмены,Это должно выглядеть примерно так:
-(void)layoutSubviews
{
[super layoutSubviews];
float cancelButtonWidth = 65.0;
UITextField *searchField = [self.subviews objectAtIndex:1];
if (self.showsCancelButton == YES)
[searchField setFrame:CGRectMake(70, 6, self.frame.size.width - 70 - cancelButtonWidth, 31)];
else
[searchField setFrame:CGRectMake(70, 6, self.frame.size.width - 70, 31)];
}
Обратите внимание, что в приведенном выше методе я добавил константу для cancelButtonWidth.Я попытался добавить код, чтобы получить ширину из [self cancelButton], но он кажется доступным только во время выполнения и не позволяет проекту компилироваться.В любом случае это должно стать хорошим началом для того, что вам нужно