Pertanyaan Menciptakan UIButton dalam bentuk gambar yang diberikan


bagaimana saya bisa membuat UIButton dalam bentuk gambar yang diberikan.

Saya dapat membuat sesuatu yang dekat dengannya, tetapi gambar tampaknya tidak pas di tombol. persyaratan saya adalah gambar yang diberikan di bawah ini.i.e; setengah lingkaran

kode yang saya gunakan untuk membuat tombol diberikan di bawah ini.

perubahan apa yang harus saya lakukan pada gambar berikut untuk mendapatkan tombol ini. subview ps-add dilakukan di kelas lain ..

btnStartGame  =[UIButton buttonWithType:UIButtonTypeCustom];
[btnStartGame setFrame:CGRectMake(60, 200, 200, 200)];

btnStartGame.titleLabel.font=[UIFont fontWithName:@"Helvetica-Bold" size:30];
[btnStartGame setImage:
[UIImage imageNamed:@"Draw button.png"]  forState:UIControlStateNormal];

btnStartGame.titleLabel.textColor=[UIColor redColor];
btnStartGame.clipsToBounds = YES;
btnStartGame.layer.cornerRadius = 50;//half of the width
btnStartGame.layer.borderColor=[UIColor redColor].CGColor;
btnStartGame.layer.borderWidth=2.0f;

btnStartGame.tag=20;
btnStartGame.highlighted=NO;

4
2018-02-07 11:21


asal


Jawaban:


Ada tutorial yang sangat bagus di sini dengan kode sumber yang dapat diunduh:

http://iphonedevelopment.blogspot.co.uk/2010/03/irregularly-shaped-uibuttons.html

Intinya Anda perlu membuat kategori di UIImage, yang memeriksa apakah titik yang Anda sentuh adalah gambar transparan atau tidak. Ini berarti Anda dapat menggunakannya untuk memeriksa tes klik pada bentuk tidak beraturan.

Anda kemudian subkelas UIButton dan over-ride the hitTest: withEvent:

Semoga ini membantu


2
2018-02-07 11:43



Meskipun solusi oleh Jeff Lamarche dihubungkan oleh jawaban lainnya berfungsi dengan baik, ia menggunakan banyak memori, dan / atau melakukan banyak pekerjaan:

  • Jika Anda membuat NSData sekali di penginisialisasi, Anda akhirnya memegang blok memori yang relatif besar untuk seumur hidup setiap tombol
  • Jika Anda membuatnya sementara, cara itu dilakukan dalam jawaban, maka Anda akhirnya mengubah seluruh gambar setiap kali Anda menekan menguji tombol Anda - memproses ribuan piksel dan membuang hasilnya setelah mengambil satu byte!

Ternyata Anda dapat melakukan ini dengan jauh lebih efisien, baik dalam hal penggunaan memori dan konsumsi CPU, dengan mengikuti pendekatan yang diuraikan dalam jawaban ini.

Subkelas UIButton, dan menimpanya pointInside:withEvent: metode seperti ini:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    if (![super pointInside:point withEvent:event]) {
        return NO;
    }
    unsigned char pixel[1] = { 0 };
    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 1, NULL, (CGBitmapInfo)kCGImageAlphaOnly);
    UIGraphicsPushContext(context);
    UIImage *image = [self backgroundImageForState:UIControlStateNormal] ;
    [image drawAtPoint:CGPointMake(-point.x, -point.y)];
    UIGraphicsPopContext();
    CGContextRelease(context);
    return pixel[0] != 0;
}

Kode di atas mengambil alpha dari gambar latar belakang tombol. Jika tombol Anda menggunakan gambar lain, ubah baris yang menginisialisasi image variabel di atas.


1
2018-04-04 10:56