Articoli con Tag ‘CGRectMake’

Objective-C: addendum su notifiche e delegati

Rispondo alla domanda di ILeW con un articolo vero e proprio per spiegare meglio, allegando esempio, come funzionano delegati e notifiche. Usando uno schema vediamo prima di tutto come funziona il pattern delegato:

Delegate

Un oggetto in cerca di un delegato

Continua...

10 utili snippet Objective-C

Spostare il doppio Tap sul simulatore

Il simulatore iPhone/iPad in Xcode permette di simulare il doppio tap con la pressione del tasto ALT. Questo è utile per simulare anche la funzione di Pinch, quella usata per ingrandire o allontare contenuti nelle view con scroll o in oggetti UIWebView. Ebbene, alcuni di voi avranno notato che la simulazione delle “due dita” procede in modo simmetrico partendo sempre dal centro dello schermo. Per muovere questo “centro” è sufficiente tenere premuto anche il tasto SHIFT.

Continua...

UIImage: utili snippet

L’oggetto UIImage, insieme a UIImageView, sono molto utilizzati nello sviluppo di applicazioni per Apple iPhone. Ecco dunque alcuni utili snippet-code effettuare una serie di elaborazioni comuni:

Combinare due (o più) immagini

1
2
3
4
5
6
7
8
9
10
11
12
- (UIImage *)combineImage:(UIImage *)imageA imageB:(UIImage *)imageB {
    UIGraphicsBeginImageContext(imageA.size);

    [imageA drawInRect:CGRectMake(0, 0, imageA.size.width, imageA.size.height)];
    [imageB drawInRect:CGRectMake(0, 0, imageB.size.width, imageB.size.height)];

    UIImage *combinatedImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return combinatedImage;
}

Continua...

Personalizzare le sezioni in un UITableView Grouped

Quando utilizziamo una UITableView in stile Grouped potremmo aver necessità di personalizzare la grafica dei titoli delle sezioni, come California o New York dell’esempio qui sotto.

UITableView

Per farlo basta utilizzare il codice seguente, inserendolo nel delegato, cioè nella classe che risponde al protocollo UITableViewDelegate:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Restituisco una mia View personalizzata, in questo caso un oggetto
// di tipo UILabel
- (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section {
 
    UILabel *label = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
    label.font = [UIFont boldSystemFontOfSize:20];
    label.textAlignment = UITextAlignmentCenter;
    label.shadowColor = [UIColor blackColor];
    label.shadowOffset = CGSizeMake(1, 1);
    label.text = @"Sezione"; // Sostituire con un array come al solito
    label.textColor = [UIColor whiteColor];
    label.backgroundColor = [UIColor clearColor];
    label.opaque = NO;
 
    return label;
}
// Bisogna supportare anche questo message altrimenti non funziona
- (CGFloat)tableView:(UITableView *)tableView
heightForHeaderInSection:(NSInteger)section {
   return 44;
}

È importante inserire anche heightForHeaderInSection, altrimenti non funziona.

Note interessanti

Nella creazione della nostra UILabel, che volendo potrebbe essere anche un oggetto più complesso come una UIView o UIImageView, ho utilizzato per inizializzare il frame CGRectZero che corrisponde a CGRectMake(0,0,0,0).

Continua...

Objective-C: un’alternativa all’uso di CGRectMake

CGRectMake() è una funzione (in realtà è un inline #define) molto usata soprattutto quando si creano da codice oggetti grafici o di interfaccia utente. Il suo utilizzo è quindi spesso legato all’inizializzazione di componenti UIKit, ma anche a semplici UIView o UIImageView. CGRectMake() restituisce una struct (struttura di tipo) CGRect:

1
2
3
4
5
struct CGRect {
  CGPoint origin;
  CGSize size;
};
typedef struct CGRect CGRect;

Che a sua volta è composta da due diverse struct CGPoint e CGSize:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct CGPoint {
  CGFloat x;
  CGFloat y;
};
typedef struct CGPoint CGPoint;

/* Sizes. */

struct CGSize {
  CGFloat width;
  CGFloat height;
};
typedef struct CGSize CGSize;

Che, a loro volta ancora, contengono tipi CGFloat, ovvero tipi float. Se andiamo ad analizzare il codice della CGRectMake() troviamo:

1
2
3
4
5
6
7
8
CG_INLINE CGRect
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
  CGRect rect;
  rect.origin.x = x; rect.origin.y = y;
  rect.size.width = width; rect.size.height = height;
  return rect;
}

Ne deriva, quindi, che questa parte di codice:

1
2
3
4
UIButton *gbutton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
gbutton.frame = CGRectMake (12,409,100,40);
[gbutton setTitle:@"Press" forState:UIControlStateNormal];
[mainWindow addSubview:gbutton];

Potrebbe, a ragione, essere scritta anche come:

1
2
3
4
UIButton *gbutton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
gbutton.frame = (CGRect) {12,409,100,40};
[gbutton setTitle:@"Press" forState:UIControlStateNormal];
[mainWindow addSubview:gbutton];

Giusto per velocizzare un po’ l’esecuzione del codice… :)

Continua...

iPhone: estendere una classe UIView

Voglio mostrare come è possibile, in modo semplice e rapido, estendere una classe UIView in modo che risponde ad un nuovo metodo di inizializzazione contenente ulteriore codice per personalizzare l’oggetto UIView creato. Come probabilmente alcuni di voi sapranno, Objective-C non supporta un unico costruttore come avviene in altri linguaggi ad oggetti (come Adobe ActionScript o PHP5). E’ possibile, infatti, creare un’istanza di una classe richiamando manualmente diversi costruttori (virtualmente infiniti). Normalmente siamo abituati a creare oggetti UIView con il classico initWithFrame. Immaginiamo però di voler creare una nuova classe di oggetti visuali, a partire da una UIView, con qualche aggiunta; ad esempio una label incorporata. In pratica quello che vogliamo ottenere è che instanziando il nostro oggetto questo crei, oltre che alla UIView, anche un oggetto di tipo UILabel. Ad esempio potremmo voler ottenere alla fine:

1
ViewLabel *vl = [[ViewLabel alloc] initWithLabelDefine:CGRectMake(0,0,320,80) label:@"Ciao"];

Per ottenere questo basta semplicemente creare una nuova classe di tipo UIView e chiamarla ViewLabel:

1
2
3
4
5
6
7
8
9
10
11
12
13
//
//  ViewLabel.h
//

#import <UIKit/UIKit.h>

@interface ViewLabel : UIView {
    UILabel *internalLabel;
}

- (id)initWithLabelDefine:(CGRect)frame label:(NSString *)labelDefine;

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//
//  ViewLabel.m
//

#import "ViewLabel.h"

@implementation ViewLabel

- (id)initWithFrame:(CGRect)frame {
   
    if (self = [super initWithFrame:frame]) {
        // Initialization code
    }
    return self;
}

//
// Il nostro nuovo inizializzatore
//
- (id)initWithLabelDefine:(CGRect)frame label:(NSString *)labelDefine {
   
    if (self = [super initWithFrame:frame]) {
        // qui potete decidere voi come comportarvi, io per
        // sicurezza ho preso lo stesso frame passato negli
        // input ma ho azzerato la x e la y
        frame.origin.x = 0;
        frame.origin.y = 0;
        internalLabel = [[UILabel alloc] initWithFrame: frame];
        internalLabel.text = labelDefine;
        [self addSubview:internalLabel];
        [internalLabel release];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    // Drawing code
}

- (void)dealloc {
    [super dealloc];
}

@end

Al momento della creazione della nostra nuova classe, potremmo usare:

1
ViewLabel *vl = [[ViewLabel alloc] initWithLabelDefine:CGRectMake(0,0,320,80) label:@"Ciao"];

Continua...

Apple iPhone SDK 3.0: risolto baco su UIButton buttonWithType

Come indicato nel post Apple iPhone SDK 3.0: prime incompatibilità le SDK 3.0 di Apple mostrano comportamenti differenti rispetto alla release 2.2.1. Il supporto di assistenza per gli sviluppatori mi ha fornito la risposta, e quindi la soluzione al problema. La risposta del supporto tecnico è stata che [UIButton buttonWithType:] già chiama – al suo interno – la initWithFrame. Ne deriva che, sempre secondo il supporto tecnico, scrivendo:

Continua...


Stop SOPA