2012-09-23 22 views
17

Tôi nghĩ từ một số điểm về OS X và luôn đúng với iOS, nội dung đó có thể xuất hiện bên ngoài giới hạn của chế độ xem? (Ví UIView) Nhưng nếu tôi tạo ra một thương hiệu mới Độc Xem ứng dụng, và tạo ra một lớp MyView rằng lớp con UIView, và thực hiện drawRect của nó:Trên iOS, drawRect không thể vẽ ra ngoài giới hạn của khung nhìn?

- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
    UIBezierPath *path = [UIBezierPath bezierPathWithRect: 
              CGRectMake(-20, -20, 600, 600)]; 
    [[UIColor greenColor] set]; 
    [path fill]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, [[UIColor blueColor] CGColor]); 
    CGContextFillRect(context, CGRectMake(-20, -20, 600, 600)); 
} 

tôi sử dụng cả hai giao diện người dùng và CG để vẽ một hình chữ nhật từng, chỉ trong trường hợp một công trình và người kia thì không. Và quan điểm được thêm vào trong viewDidAppear:

- (void)viewDidAppear:(BOOL)animated { 
    MyView *myView = [[MyView alloc] initWithFrame:CGRectMake(20, 20, 260, 260)]; 
    [self.view addSubview:myView]; 
} 

Nhưng không có vấn đề gì, hộp màu sẽ không đi xa hơn khu vực (20, 20, 260, 260). Có đúng là chỉ các CALayer mới có thể được tự do thêm vào và xuất hiện bên ngoài giới hạn của khung nhìn? Có thể vì ngữ cảnh đồ họa bị giới hạn ở số (20, 20, 260, 260) này để bắt đầu không? Nếu vậy, có cách nào để làm cho nội dung drawRect xuất hiện bên ngoài giới hạn của chế độ xem không, trong tất cả bốn hướng trên cùng, xuống, trái, phải?

+0

Tôi có thể hỏi, tại sao bạn muốn vẽ bên ngoài hình ảnh trực quan có thể nhìn thấy vì nó sẽ không hiển thị? Nếu bạn có kế hoạch làm cho nó có thể nhìn thấy sau này, bạn nên sử dụng một CALayer như bạn đã đề cập một cách chính xác. – Lefteris

+0

một lý do là, tôi đang nghĩ đến việc triển khai PopoutScrollView có góc tròn hoặc thậm chí là "đám mây như các cạnh". Tôi thấy rằng tôi có thể phân lớp UIView và có một UIScrollView như là một tài sản, để scrollview là một subview của khung nhìn, và tôi thực sự phải ghi đè lên 'addSubview' để thêm vào' self.scrollView'. Điều này là bởi vì tôi không thể đơn giản vẽ các đường viền trên một scrollView, nếu không chúng sẽ cuộn đi. Điều này có thể phức tạp, và tôi nghĩ, tại sao không chỉ phân lớp UIScrollView, và trong drawRect, vẽ ra ngoài giới hạn? Sau đó, tôi không phải ghi đè quá nhiều phương pháp. –

+0

Mặc dù tôi chưa thử điều này, nhưng tôi không thấy lý do cho việc này không hoạt động, thêm các góc tròn vào scrollview, thông qua thuộc tính scrollview.layer.cornerRadius nên làm điều này dễ dàng cho bạn. Ngoài ra nếu bạn có kế hoạch sửa đổi một scrollView, bạn nên phân lớp scrollview và phương pháp drawRect của nó, thay vì một UIView – Lefteris

Trả lời

0

Hãy thử điều này trên một cái nhìn, nơi bạn đã thêm scrollview:

self.scrollView.backgroundColor = [UIColor darkGrayColor]; 
self.scrollView.layer.cornerRadius = 10.0f; 
self.scrollView.layer.masksToBounds = YES; 

Nó sẽ hiển thị một scrollview màu xám với góc tròn, như bạn muốn.

Hãy nhớ rằng bạn cần phải nhập khẩu các QuartzCore FrameWork

+0

nếu cần phải vượt quá giới hạn thì sao? –

+0

Tôi không hiểu câu hỏi – Lefteris

+0

Ý tôi là, mã ở trên sẽ vẽ nền tất cả trong giới hạn của chế độ xem. Điều gì sẽ xảy ra nếu chúng ta cần vẽ một cái gì đó 10 pixel trên đầu trang, 10 pixel ở bên trái của lề trái, vv (vẽ một cái gì đó, hoặc trong trường hợp này là để vẽ nền và các góc tròn) –

20

Vấn đề của bạn là "drawRect" được tự động cắt bớt để quan điểm cho rằng bạn đang vẽ.

Thay vì làm các bản vẽ trong giao diện bản thân , thêm chế độ xem thứ hai (phụ) vào chế độ xem đầu tiên, nằm ngoài giới hạn của chế độ xem đầu tiên. Điều này sẽ cho phép bạn thực hiện việc vẽ phụ thuộc vào vị trí của chế độ xem đầu tiên, nhưng nằm ngoài giới hạn của chế độ xem đầu tiên.

Hy vọng điều này sẽ hữu ích.