Skip to main content

(Kinh nghiệm) Auto layout và Size classes trong iOS - Phần 2

Ở phần 1 mình đã hướng dẫn căn bản về Auto Layout và Size Classes, nếu bạn chưa biết gì về Auto Layout trên iOS xin hãy xem qua phần 1 tại đây. Phần 2 này mình xin đi chi tiết về cách dùng những constraint khi làm Auto Layout.

  • Tab thứ 1 (Align): Tab này giúp chúng ta canh chỉnh đối tượng này theo đối tượng kia, vì thế ta phải chọn từ 2 đối tượng này trở lên thì mình mới có thể sử dụng được. Lưu ý: Trước tên có icon để minh hoạ từng chức năng. 
- Leading Edges: Dùng để canh 2 đối tượng đó theo cạnh bên trái.
- Trailing Edges: Dùng để canh 2 đối tượng đó theo cạnh bên phải.
- Top Edges: Dùng để canh 2 đối tượng đó theo cạnh ở trên.
- Bottom Edges: Dùng để canh 2 đối tượng đó theo cạnh ở dưới.
- Horizontal Centers: Dùng để canh 2 đối tượng đó ở chính giữa theo chiều ngang.
- Vertical Centers: Dùng để canh 2 đối tượng đó ở chính giữa theo chiều dọc.
- Baselines: Dùng để canh 2 đối tượng đó theo đường cố định. Mình thường dùng cái này để canh chỉnh Label. Để xem thêm thông tin Baseline xin xem thêm tại đây.


Horizontal Centers in Container: Dùng để canh 1 hoặc 2 đối tượng đó ở chính giữa đối tượng cha chứa nó, theo chiều ngang.
Vertical Centers in Container: Dùng để canh 1 hoặc 2 đối tượng đó ở chính giữa đối tượng cha chứa nó, theo chiều dọc.

Khi nhấn vào checkbox của Update Frames sẽ ra màn hình như bên dưới: 
Chức năng này dùng để chúng ta update lại frame theo những thông số constraint mà mình sẽ tạo.
- None: Không cập nhật
- Items of New Constraints: Chỉ cập nhật những frame có liên quan đến đối tượng này và những đối tượng khác có liên quan đến đối tượng sắp được thêm vào.
- All Frames in Contrainer: Cập nhật tất cả những frame trong khung chứa này luôn.

  • Tab thứ 2 (Pin): Tab này giúp chúng ta cố định những đối tượng vào những đối tượng khác ( ví dụ như view cha, hoặc những đối tượng con nằm kế bên,...). Bạn nên ưu tiên pin đối tượng từ trên xuống dưới hay từ dưới lên trên.
- 4 ô textfields ở mỗi hướng chỉ vị trí hiện tại đang cách đối tượng gần nó bao nhiêu, nếu ta muốn khoảng cách bao nhiêu thì ta có thể nhập số vào từng ô tương ứng và chọn những hướng mình muốn pin nó vào (hiện tại chưa chọn nên màu nhạt).
- Constrain to margins: Checkbox này dùng để pin đối tượng này so với đường margin của đối tượng, mặc định đường margin này có giá trị là 16 ppi. Vì thế mặc dù mình đang cách bên trái là 20 ppi nhưng trên hình hiển thị chỉ có 4 ppi.
Lưu ý: Theo mình mọi người không nên dùng chức năng này để canh chỉnh vì có thể sẽ bị crash ứng dụng khi chạy trên iOS 7 và iOS 8, ngoài ra chúng ta sẽ dễ bị lẫn lộn khoảng cách padding giữa đối tượng hiện tại và cạnh margin hoặc cạnh của view cha. Có người giải thích không dùng UIView.layoutMargins và UIView.preservesSuperviewLayoutMargins  thì sẽ không bị crash ứng dụng, nguồn tại đây. Nếu ứng dụng của bạn viết từ iOS 8 trở lên thì bạn có thể dùng chức năng này, và bạn có thể dễ dàng thiết lập lại giá trị mặc định của margin.
- Width: sẽ cố định chiều rộng của đối tượng này theo giá trị trong ô.
- Height: sẽ cố định chiều cao của đối tượng này theo giá trị trong ô.

- Equal Widths: chỉ tác dụng khi bạn chọn từ 2 đối tượng trở lên, thuộc tính này quan trọng vì thế các bạn nên chú ý. Thuộc tính này sẽ cố định chiều rộng của 2 đối tượng theo tỷ lệ, mặc định tỷ lệ giữa 2 đối tượng là bằng nhau. Chúng ta có thể thay đổi tỷ lệ của 2 đối tượng đó như sau:
Ví dụ: Giả sử mình có Label A (W:100 ppi) có chiều rộng bằng một nửa chiều rộng của Label B (W:200 ppi) thì ban đầu mình chọn 2 đối tượng này và mình dùng thuộc tính 'Equal Widths' nó sẽ hiển thị như hình bên dưới:
Những báo hiệu màu cam của từng đối tượng là nó báo bạn đã config sai chiều rộng của 2 đối tượng này là 100 ppi, vì thế bạn chọn vào constraint của thuộc tính này nó sẽ hiển thị thông tin như trên tab Size Inspector. Trong đây bạn nên chú ý những thuộc tính như First Item, Relation, Second Item, và Multiplier. First Item của mình là Label A, và Second Item là Label B, vì thế mình sẽ chọn quan hệ (Relation) theo quan hệ nhỏ hơn hoặc bằng (Less Than or Equal) và tỷ lệ của nó là một nửa vì thế trong ô Multiplier mình sẽ đánh giá trị là 0.5. Sau khi mình config xong thì XCode sẽ không báo warning nữa và hình như sau:
Tuỳ theo First Item và Second Item là gì mình sẽ chỉnh những thông số thích hợp. Priority cũng rất quan trọng cho việc sắp xếp thứ tự ưu tiên giữa những constraint với nhau, bạn thiết lập sao cho uyển chuyển và làm chính xác giao diện mình mong muốn là được. Priority có 3 mức độ là 1000 là Required, 750 là High và 250 là Low.


Equal Heights: chỉ tác dụng khi bạn chọn từ 2 đối tượng trở lên, thuộc tính này quan trọng. Thuộc tính này sẽ cố định chiều cao của 2 đối tượng theo tỷ lệ, mặc định tỷ lệ giữa 2 đối tượng là bằng nhau.
- Aspect Ratio: thuộc tính này sẽ canh tỷ lệ giữa chiều cao và chiều rộng của 1 đối tượng hoặc chiều cao của đối tượng này với chiều rộng của đối tượng kia. Để khi kích thước đối tượng cha thay đổi thì sẽ tăng giảm theo tỷ lệ này.
- Align: giống như tab Align.
- Update Frame: tương tự trong tab Align.
  • Tab thứ 3 (Resolve Auto Layout Issues): Tab này giúp chúng ta sửa những lỗi trên layout. Tab này rất quan trọng, vì thế các bạn cũng nên chú ý những phím tắt để có thể thao tác chỉnh sửa cho nhanh.
Tại đây có 2 phần là 'Selected Views': chỉ tác động trên những view mình đang chọn. Và 'All Views in View Controller' sẽ tác động tất cả những view trong ViewController.
- Update Frames: khi bạn thay đổi giá trị Constaint của constraint thì bạn để ý XCode sẽ cảnh báo kích thước những đối tượng không đúng và sai bao nhiêu, bạn muốn chỉnh sửa những đối tượng đó chính xác theo những constraint bạn đã sửa lại thì bạn dùng chức năng này sẽ tự động canh chỉnh những đối tượng đó.
- Update Constraints: sẽ thay đổi lại giá trị Constaint theo vị trí hiện tại của đối tượng đó. Thuộc tính này ngược so với thuộc tính Update Frames.
- Add Missing Constraints: sẽ thêm những constraints còn thiếu để đảm bảo tính chính xác giữa những đối tượng và XCode sẽ không báo error hay warning về constraints.
- Resert to Suggested Constraints: sẽ xoá những constraints được thêm khi bạn dùng chức năng 'Add Missing Constraints'
- Clear Constraints: xoá tất cả những constraints hiện tại. Khi bạn muốn thiết lập lại toàn bộ thì nên dùng chức năng này để xoá cho nhanh.

Công cụ dùng để viết: XCode 6.3, iOS 8.3

Tài liệu tham khảo:
Cconstrain-to-margin-in-storyboard-in-xcode-6
- What's new in Interface Builder in WWDC 2014.

Comments

Popular posts from this blog

So sánh những framework hỗ trợ viết ứng dụng trên SmartPhone

Khi lập trình trên SmartPhone bạn không nhất thiết phải học những ngôn ngữ đặc thù trên từng loại hệ điều hành thì mới có thể lập trình được. Ví dụ như muốn lập trình trên iOS thì phải học ngôn ngữ Objective-C hay Swift, muốn lập trình được trên Android thì học ngôn ngữ Java, muốn lập trình trên WinPhone thì học ngôn ngữ C#. Hiện nay có rất nhiều những framework giúp đỡ cho các bạn rất nhiều khi các bạn muốn viết trên nhiều nền tảng smartphone bằng ngôn ngữ mà bạn yêu thích. Theo mình thấy thì hiện nay có 3 loại như: Native App, Hybrid Mobile App, Native Cross-Platform App. 1. Native App: là những ứng dụng sử dụng những framework và ngôn ngữ lập trình của hệ thống cung cấp sẵn. Ví dụ như bạn muốn lập trình iOS thì phải cài XCode, học ngôn ngữ Objective-C hay Swift, lập trình Android thì cài Android Studio và học ngôn ngữ Java. - Ưu điểm: Hiệu năng thực thi ứng dụng trên nền tảng nhanh và hiệu quả. Không bị phụ thuộc vào bên thứ 3. Khi phát hành ứng dụng trên những Mobile Store cũng dễ...

(Kinh nghiệm) Về static library và static framework trên iOS

Trước XCode 6 ra đời thì đa số mọi người muốn viết những code chung trong static library để có thể dùng cho nhiều project. Có những người tạo project là static library nhưng khi build thì tạo folder có đuôi là .framework để add những file header và static library vào. Nhưng thực chất nó cũng chỉ là static library. Vì khi bạn muốn tích hợp những static library khác vào project static library mà bạn đang làm thì sẽ gặp nhiều vấn đề xảy ra. Vì thế khi bạn làm project framework mà có tích hợp những static library khác vào thì nên khởi tạo project theo dạng framework (Cocoa Touch Framework) như sau: Bạn có thể xem hướng dẫn từng bước tạo framework và tích hợp framework đó vào project tại đây . PS: Nếu bạn không muốn viết kiểu này thì chỉ có thể tích hợp nhiều static library trong application project. Hoặc có thể viết static library tích hợp vào cocoapods để tích hợp và update cho thuận tiện, có thể tham khảo cách làm tại đây .

Hướng dẫn dùng Serverless sử dụng Lambda AWS

1. Lambda function là gì? AWS Lambda cho phép bạn chạy mã mà không cần cung cấp hay quản lý máy chủ. Bạn chỉ phải trả tiền cho thời gian xử lý thông tin đã sử dụng. Với Lambda, bạn có thể chạy mã cho gần như toàn bộ các loại ứng dụng hay dịch vụ backend – tất cả đều không cần quản trị. Chỉ cần tải đoạn mã của bạn lên và Lambda sẽ lo hết những gì cần làm để chạy và mở rộng mã của bạn với mức độ có sẵn cao. Bạn có thể thiết lập mã của bạn tự động kích hoạt từ các dịch vụ AWS khác, hoặc gọi trực tiếp từ bất cứ ứng dụng web hay di động nào. Chi phí chạy trên lambda function rẻ so với chi phí bạn mua 1 con server, duy trì và quản trị nó ( ví dụ như bạn phải xử lý bất đồng bộ những request, khi lượng user bạn tăng đột biến bạn phải có cơ chế auto scale, chứ không thì server bị sẽ bị treo, khi server bị treo bạn phải tự động khởi động lại sẽ mất thời gian,... ).