5.5 Màn Hình Runtime
5.5.3 Đối Tượng Label
Label giúp người dùng có viết chữ để hiện thị các thông tin cần thiết. Các bước làm việc với Label.
Bước 1: Đầu tiên cần tạo Class để đưa vào cho đối tượng các thuộc tính mong muốn mà thư viện chuẩn chưa có. Ví dụ như là TagAssign, Decription ..v..v
Trong đó đối tượng ngoài có các thuộc tính mặc định của xcode hỗ trợ thì nay có thêm thuộc tính tagAssign và decription phục vụ cho nhu cầu viết code.
Các hàm Init trong file .m phục vụ cho việc khởi tạo một đối tượng mới với các thông số khởi tạo mong muốn.
Page 45
Các bước tạo Class mới
Click chuột phải vào 1 group và chọn New File
Hình 5-12 Giao diện tạo một class mới Chọn Object-C Class rồi chọn Next
Page 46
Điền tên Class
Hình 5-14 Giao diện tạo Class mới
Chú ý trong cửa sổ này nhớ tick chọn Target. Và chọn Create thế là xong.
Hình 5-15 Giao diện tạo Class mới
Bước 2: trong giao diện Runtime ta tạo một đối tượng Label bằng cách kéo từ Object Library bên tay phải. Tiếp theo ta phải đặt địa chỉ để có thể quản lý đối tượng trên.
Page 47
- Gán TapGestureRecognizer lên đối tượng Label để khi người dùng chạm lên Label thì sẽ tạo ra đối tượng Label:
tapLabelGesture=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapLabel:)];
[labelCreated addGestureRecognizer:tapLabelGesture]; -Hàm ngắt khi người dùng chạm vào Label:
Trong đoạn Code trên ta chú ý kích thước CGRectMake(205, 290,50.0, 50.0) có ý nghĩa như sau:
tapLabelGesture=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapLabel:)];
[tapLabelGestureArray addObject:tapLabelGesture]
panLabelGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragGesture:)];
[panLabelGestureArray addObject:panLabelGesture];
pinchLabelGesture =[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchMe:)];
[pinchLabelGestureArray addObject:pinchLabelGesture];
labelCreated=[[Label alloc] initWithFrame:CGRectMake(205, 290, 50.0, 50.0)]; labelCreated.text=@"Label"; labelCreated.tag=labelTagID; labelTagID++; [labelArray addObject:labelCreated]; [self.view addSubview:labelCreated]; [labelCreated addGestureRecognizer:panLabelGesture]; [labelCreated addGestureRecognizer:tapLabelGesture]; [labelCreated addGestureRecognizer:pinchLabelGesture]; [labelCreated setUserInteractionEnabled:YES]; }
Page 48
2 số đầu (205 ,290) là vị trí (x,y) xuất hiện đối tượng Label còn (50.0,50.0) là kích thước của Label.
Đối tượng mới được tạo ra được gán các GestureRecognizer như Pan, Tap và Pinch khi phát hiện có thao tác người dùng trên đối tượng thì chương trình sẽ trả về hàm ngắt tương ứng (tên hàm ngắt nằm trong phần action). Các đối tượng sẽ có cùng một tên nhưng được phân biệt dựa vào “tag” (cụ thể trong chương trình là labelCreated.tag).
Các Label cũng như các GestureRecognizer liên quan sẽ được lưu vào các mảng tương ứng để phục vụ cho các thao tác xử lý sau này (hàm phục vụ thêm đối tượng vào mảng là [labelArray addObject:labelCreated]).
Bước 3: Cho phép người dùng thay đổi thuộc tính của đối tượng đã tạo ra.
Trước hết cần phải có giao diện để phục vụ cho việc thay đổi này. Như vậy ta cần tạo 1 giao diện phụ (theo kiêu UIViewController) để tạo Pop-up khi chạm vào đối tượng, trên đó sẽ có đầy đủ các thuộc tính cần thay đổi của đối tượng.
Các bước tạo một Class view mới cũng giống như tạo Class bình thường (đã được hướng dẫn ở trên) chỉ khác ở điểm là ở cửa sỗ Choose option for your new file ta chọn Subclass là UIViewController
Hình 5-16 Giao diện tạo Class mới
Sau đó ta thiết kế giao diện hoàn chỉnh theo ý mình, cho vào các Textfield để thay đổi thông số về Label. Nhớ chú ý phần Size nên chọn FreeForm để có thể tinh chỉnh kích thước, giá trị này phải được đưa đúng vào chương trình chính.
Page 49
Hình 5-17 Giao diện thiết kế Pop-Up Trong LabelDeignView ta chú ý đoạn code sau:
Hàm này được sẽ được gọi trước khi giao diện được hiện lên, nó sẽ lấy tất cả thuộc tính của đối tượng cần thay đổi và thể hiện lên trên giao diện của chúng ta. Và đoạn code labelCreated = label; có ý nghĩa là con trỏ địa chỉ labelCreated trong giao diện được gán địa chỉ của đối tượng cần được thay đổi thuộc tính. Như vậy mọi thay đổi trên laeblCreated cũng chính là thay đổi trên đối tượng chính. Vậy phần thiết kế giao diện phục vụ người dùng thay đổi thuộc tính của đối tượng đã xong, bây giờ điều cần biết là khi nào giao diện này sẽ được gọi lên. Tạm gọi là giao diện “edit”.
- (void) initViewWithPropertiOfLabel: (Label *) label{
labelcreate = label;
txtName.text = [NSString stringWithFormat:@"%@",label.text];
txtNameTag.text = [NSString stringWithFormat:@"%@",label.tagAssign];
txt_textColor.backgroundColor = label.textColor;
txt_backGroundColor.backgroundColor = label.backgroundColor; }
Page 50
Trong bước tạo đối tượng label ta đã gán TapGestureRecognizer vào cho nên khi có thao tác chạm vào đối tượng thì ta sẽ nhận được hàm ngắt. Và trong hàm ngắt đó ta sẽ gọi giao diện “edit” lên.
-(void) tapLabel: (UITapGestureRecognizer *) tapedLabel{ labelTapedID=tapedLabel.view.tag;
labelInProcess = [[Label alloc] init];
labelInProcess = [labelArray objectAtIndex:labelTapedID]; labelDesignViewController.modalPresentationStyle = UIModalPresentationFormSheet;
labelDesignViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:labelDesignViewController animated:YES completion:NULL]; labelDesignViewController.view.superview.center = self.view.superview.center; labelDesignViewController.view.superview.frame = CGRectMake(50, 50, 330, 370); [labelDesignViewController initViewWithPropertiOfLabel:labelInProcess]; labelDesignViewController.delegate=self; }
Page 51
Trong đoạn code trên dòng lệnh giúp ta xác định được Label mà ta đang chạm vào là Label nào trong mảng đã tạo ra là:
labelTapedID=tapedLabel.view.tag; labelInProcess = [[Label alloc] init];
labelInProcess = [labelArray objectAtIndex:labelTapedID];
Ta chú ý phải điền đúng giá trị ở đoạn code CGRectMake(50, 50, 330, 370), đó chính là kích thước Pop up ta đã tạo ra.
-(void) tapLabel: (UITapGestureRecognizer *) tapedLabel{ labelTapedID=tapedLabel.view.tag;
labelInProcess = [[Label alloc] init];
labelInProcess = [labelArray objectAtIndex:labelTapedID]; labelDesignViewController.modalPresentationStyle = UIModalPresentationFormSheet;
labelDesignViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:labelDesignViewController animated:YES completion:NULL]; labelDesignViewController.view.superview.center = self.view.superview.center; labelDesignViewController.view.superview.frame = CGRectMake(50, 50, 330, 370); [labelDesignViewController initViewWithPropertiOfLabel:labelInProcess]; labelDesignViewController.delegate=self; }
Page 52