Создание масштабируемой кнопки Image в iOS. Без размытого изображения.

Что я пытаюсь сделать:

Я хочу сделать кнопку, которая масштабируется вверх или вниз в зависимости от ее текущего состояния, которое определяется большим или маленьким.

Когда кнопка большая и я нажимаю ее, она становится маленькой. Когда кнопка маленькая и я нажимаю ее, она становится большой.

Кнопка должна содержать изображение QR-кода и впоследствии сканироваться QR-ридером.

Моя проблема:

Это изображение расплывчато, когда большой. Это не тот случай, когда я помещаю изображение в ImageView вместо кнопки.

Эффект лучше всего описан здесь: http://imgur.com/a/h3rJg

Код:

Объявление кнопки / изображения

UIImage* image = [QREncoder encode:user];
// declare image - QREncoder can be found on github
UIImage *strechedBackground = [image stretchableImageWithLeftCapWidth:220 topCapHeight:220];
UIImageView* imageView = [[UIImageView alloc] initWithImage:image];
CGFloat qrSize = self.view.bounds.size.width - kPadding * 2;
CGRect largeFrame = CGRectMake(kPadding, (self.view.bounds.size.height - qrSize) / 2,
                          qrSize, qrSize);
imageView.frame = largeFrame;
[imageView layer].magnificationFilter = kCAFilterNearest;

//[self.view addSubview:imageView];

// add qr button to the view
self.qrButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.qrButton.frame = largeFrame;
[self.qrButton setBackgroundImage:image forState:UIControlStateNormal];
[self.qrButton addTarget:self
           action:@selector(aMethod)
 forControlEvents:UIControlEventTouchDown];
self.qrButton.contentMode = UIViewContentModeCenter;    


[self.view addSubview:self.qrButton];

Функция масштабирования кнопки / изображения

- (void)aMethod{
// some variables concerned with button sizes and dimensions
CGFloat qrSize = self.view.bounds.size.width - kPadding * 2;
CGRect largeFrame = CGRectMake(kPadding, (self.view.bounds.size.height - qrSize) / 2,
                               qrSize, qrSize);

CGFloat smallButtonWidth = 33.0;
CGFloat smallButtonHeight = 33.0;

CGFloat largeButtonWidth = 264.0;
CGFloat largeButtonHeight = 264.0;

CGRect smallFrame = CGRectMake(self.view.frame.size.width - smallButtonWidth - kPadding/2, self.view.frame.size.height - smallButtonHeight - kPadding/2, smallButtonWidth, smallButtonHeight);
// a boolean ivar indicates the size of the button
if (!self.qrButtonIsBig){

    NSLog(@"Button was Big");


    // animate the view...
    [UIView animateWithDuration:0.5
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
                         //self.qrButton.transform = CGAffineTransformMakeScale(3, 3);
                         // resting positon after animation
                         self.qrButton.frame = smallFrame;
                     }
                     completion:nil];

    NSLog(@"Button is now Small");


}else{

    NSLog(@"Button was Small");

    // animate the view...
    [UIView animateWithDuration:0.5
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
                         self.qrButton.transform = CGAffineTransformIdentity;
                         // resting positon after animation, bottom left with 20 px margin
                         self.qrButton.frame = largeFrame;
                     }
                     completion:nil];

    NSLog(@"Button is now Big");

}
self.qrButtonIsBig = !self.qrButtonIsBig;

}

2 ответа

Решение

Так как ImageView был резким, а ButtonImage размытым. Имеет смысл масштабировать изображение с помощью невидимой кнопки сверху для практической работы, а не для того, чтобы изображение было четким на кнопке.

Если вам нужно, чтобы ваше представление было более четким при изменении его размера, тогда вам нужно, чтобы ваш класс CALayer был CATiledLayer. Вы можете разделить его на подклассы, чтобы определить, как вы будете заполнять свои плитки. Проверьте этот вопрос, если вы хотите пойти по этому пути, проверьте этот вопрос, если вы не хотите использовать CATiledLayer

Другие вопросы по тегам